XML mittels XPath auslesen

mschlegel

Erfahrenes Mitglied
Hallo

Ich habe bereits diverse Anleitungen zu diesem Thema gefunden, aber irgendwie will das einfach nicht funktionieren. Deshalb frage ich jetzt einmal hier nach.

Ich habe folgendes XML aus welchem ich einfach die ReportParameter auslesen möchte
XML:
<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner">
  <DataSources>
    <DataSource Name="ORA_FLATEY">
      <rd:DataSourceID>5404f7d5-f22c-4e65-9dca-63a68bc7f288</rd:DataSourceID>
      <DataSourceReference>ORA_FLATEY</DataSourceReference>
    </DataSource>
  </DataSources>
  <InteractiveHeight>11in</InteractiveHeight>
  <ReportParameters>
    <ReportParameter Name="param_AssessmentType">
      <DataType>String</DataType>
      <DefaultValue>
        <Values>
          <Value>=1</Value>
        </Values>
      </DefaultValue>
      <Prompt>Assessment-Type</Prompt>
      <ValidValues>
        <DataSetReference>
          <DataSetName>AssessmentType</DataSetName>
          <ValueField>TYPEID</ValueField>
          <LabelField>TYPENAME</LabelField>
        </DataSetReference>
      </ValidValues>
    </ReportParameter>
    <ReportParameter Name="param_Department">
      <DataType>...
     ....

Mein Code zum auslesen schaut folgendermaßen aus
C#:
XmlDocument xdoc = new XmlDocument();
xdoc.Load(stream);

//XmlNamespaceManager xmlnsManager = new XmlNamespaceManager(xdoc.NameTable);
//xmlnsManager.AddNamespace("Report", "http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition");

XmlNodeList parameters = xdoc.SelectNodes("//Report/ReportParameters/ReportParameter", xmlnsManager);
foreach (XmlElement element in parameters)
Aus irgend einem Grund enhällt die Liste nach der Abfrage aber keine Elemente. Der Stream funktioniert, da mir der Inhalt im Debugger in der Variable xdoc angezeigt wird.
Wie ihr sehen könnt habe ich es auch schon mit dem Namespace versucht und auch schon diverse Variationen in meiner Expression ausprobiert. Eigentlich müsste es doch funtionieren? Kann jemand hier einen Fehler entdecken?

Vielen Dank
 
Zuletzt bearbeitet von einem Moderator:
Moin,

nachfolgend eine kurze Erklärung anhand eines Codebeispiels aus einem aktuellen Projekt:


C#:
XPathNavigator xnav = xdoc.CreateNavigator();
XPathNodeIterator xiter_SelectionFilters = xnav.Select("/Report/SelectionFilters/SegmentFilters/SegmentFilter");
List<Segment> listSegmente = new List<Segment>();
while (xiter_SelectionFilters.MoveNext())
{
	Segment segment = SegmentManager.Instance.GetSegment(xiter_SelectionFilters.Current.Value);
	listSegmente.Add(segment);
}


Unterschiede zu deinem Versuch
1. Erzeuge einen XPathNavigator
2. Erzeuge einen XPathNodeIterator aus dem Navigator, der XPath Ausdruck aus meinem Beispiel liest ebenfalls ab dem Root-Node.
3. Iteriere über das Ergebnis des Select und lese die Werte xiter_SelectionFilters.Current.Value
 
Zuletzt bearbeitet:
Du hast da einen Namespace, dem kein Präfix zugewiesen ist. Das passt so für das XML: Für deine XPath-Query brauchst du jedoch einen Präfix, damit das korrekt aufgelöst werden kann.

Hier ein XML (welches ich mir jetzt einfach aus deinem rauskopiert habe):
Code:
<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner">
	<DataSources>
		<DataSource Name="ORA_FLATEY">
			<rd:DataSourceID>5404f7d5-f22c-4e65-9dca-63a68bc7f288</rd:DataSourceID>
			<DataSourceReference>ORA_FLATEY</DataSourceReference>
		</DataSource>
	</DataSources>
	<InteractiveHeight>11in</InteractiveHeight>
	<ReportParameters>
		<ReportParameter Name="param_AssessmentType">
			<DataType>String</DataType>
			<DefaultValue>
				<Values>
					<Value>=1</Value>
				</Values>
			</DefaultValue>
			<Prompt>Assessment-Type</Prompt>
			<ValidValues>
				<DataSetReference>
					<DataSetName>AssessmentType</DataSetName>
					<ValueField>TYPEID</ValueField>
					<LabelField>TYPENAME</LabelField>
				</DataSetReference>
			</ValidValues>
		</ReportParameter>
	</ReportParameters>
</Report>
Und hier mein Code mit der Abfrage:
Code:
XmlDocument doc = new XmlDocument();

doc.Load("Demo.xml");

XmlNamespaceManager xmlnsManager = new XmlNamespaceManager(doc.NameTable);
xmlnsManager.AddNamespace("temp", "http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition");
xmlnsManager.AddNamespace("rd", "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner");

XmlElement root = doc.DocumentElement;

XmlNodeList xnl = root.SelectNodes("//temp:Report/temp:ReportParameters/temp:ReportParameter", xmlnsManager);
foreach (XmlNode xn in xnl)
{
    Console.WriteLine(xn.Attributes[0].InnerText);
}
Das sollte dir soweit weiterhelfen.
 
Vielen Dank

Mit dem Namespace hatte ich es ja auch schon versucht,aber ich wusste nicht dass ich den bei jedem Knoten angeben. Wieder etwas gelernt ;)
 
Interessant!

Wurde dem Namespace kein Präfix zugewiesen muss dies für XPath im Programm geschehen.

Andere Frage: Wie ist das denn, wenn man ein XML Dokument liest, welches keine Namespaces verwendet? Muss dann ebenfalls z.B. ein temp-Namespace verwendet werden oder funktioniert es dann komplett ohne?!
 
Wenn du gar keine Namespace-Angabe hast, dann brauchst du auch keinen Namespace Manager. Also komplett ohne Namespace.
 
Zurück