[C#] selektieren mit XPATH
Harlequin
- xml
Yerf!
ich bin grad blind und find den Fehler nicht...
Ich versuch in einem XML-Excel-Sheet einzelne Zellen auszulesen. Die Zeilen der Reihe nach durchzugehen klappt ohne Probleme. Damit hab ich momentan folgende Zeile als XmlNode:
<Row ss:AutoFitHeight="0" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns="urn:schemas-microsoft-com:office:spreadsheet"><Cell><Data ss:Type="String">X</Data></Cell><Cell><Data ss:Type="String">Y</Data></Cell><Cell><Data ss:Type="String">Z</Data></Cell><Cell><Data ss:Type="String">AB</Data></Cell><Cell ss:Index="7" ss:StyleID="s23"><Data ss:Type="Number">4711</Data></Cell></Row>
Nun versuch ich die Zelle mit dem Attribut ss:Index="7" zu bekommen:
XmlNode cell = row.SelectSingleNode(String.Format("/ss:Cell[@ss:Index={0}]", index + 1), nsmgr);
index ist dabei 6, nsmgr ist der NamespaceManager, den ich auch für die Zeilen benutze (ist somit korrekt), aber das Ergebnis ist leider "null".
Was läuft da falsch?
Gruß,
Harlequin
Hi!
<Row ss:AutoFitHeight="0" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns="urn:schemas-microsoft-com:office:spreadsheet"><Cell><Data ss:Type="String">X</Data></Cell><Cell><Data ss:Type="String">Y</Data></Cell><Cell><Data ss:Type="String">Z</Data></Cell><Cell><Data ss:Type="String">AB</Data></Cell><Cell ss:Index="7" ss:StyleID="s23"><Data ss:Type="Number">4711</Data></Cell></Row>
Nun versuch ich die Zelle mit dem Attribut ss:Index="7" zu bekommen:
XmlNode cell = row.SelectSingleNode(String.Format("/ss:Cell[@ss:Index={0}]", index + 1), nsmgr);
index ist dabei 6, nsmgr ist der NamespaceManager, den ich auch für die Zeilen benutze (ist somit korrekt), aber das Ergebnis ist leider "null".
Ob das string.Format() wie gewünscht arbeitet, kannst du im Debugger überprüfen. Wenn ja, kannst du es für es für die Problembeschreibung rauskürzen.
Du möchtest das Attribut Index aus dem Namespace-Alias ss haben. Bist du sicher, dass sich Cell im selben Namespace befindet? Es ist schließlich ohne Alias notiert.
Lo!
Yerf!
Der Debugger sagt:
String.Format("/ss:Cell[@ss:Index={0}]", index + 1) "/ss:Cell[@ss:Index=7]" string
Sieht soweit gut aus. Ein
XmlNode test = row.SelectSingleNode("/ss:Cell[@ss:Index=7]", nsmgr);
liefert aber auch null.
Der Default-Namespace der Zelle ist der gleiche wie der für "ss", liegt an
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
Den Namespace-Manager lege ich so an:
nsmgr = new XmlNamespaceManager(cTypeDoc.NameTable);
nsmgr.AddNamespace("ss", "urn:schemas-microsoft-com:office:spreadsheet");
Das selektieren der Elemente aus dem Default-Namespace über den prefix "ss" funktioniert auch, denn genau so hol ich mir die Rows (über die ich dann mit foreach iteriere).
XmlNodeList rows = cTypeDoc.SelectNodes("/ss:Workbook/ss:Worksheet/ss:Table/ss:Row", nsmgr);
Gruß,
Harlequin
Hi!
Ein
XmlNode test = row.SelectSingleNode("/ss:Cell[@ss:Index=7]", nsmgr);
liefert aber auch null.
Der Default-Namespace der Zelle ist der gleiche wie der für "ss", [...]
Gut, dann sieht es nach einem XML-Problem aus. Hast du mal ./ und das Weglassen des / am Anfang probiert?
Lo!
Yerf!
Gut, dann sieht es nach einem XML-Problem aus. Hast du mal ./ und das Weglassen des / am Anfang probiert?
Ok, ohne dem / bekomm ich die Zelle... jetzt wär noch interessant, wieso? Da ich den Ausdruck auf die Row loslasse müsste das doch der Root-Knoten sein, oder?
Aber danke schonmal.
Gruß,
Harlequin
Hi,
Gut, dann sieht es nach einem XML-Problem aus. Hast du mal ./ und das Weglassen des / am Anfang probiert?
Ok, ohne dem / bekomm ich die Zelle... jetzt wär noch interessant, wieso? Da ich den Ausdruck auf die Row loslasse müsste das doch der Root-Knoten sein, oder?
Der Root-Knoten ist document root.
Wenn Du relativ zum aktuellen Knoten adressieren willst, muß das / weg.
Ist ähnlich wie bei relativen Dateipfaden.
cu,
Andreas
Yerf!
Der Root-Knoten ist document root.
Mein Fehler war dann wohl anzunehmen, das wenn ich den Ausdruck auf die Referenz eines Kindknotens anwenden, das der dann ein eigenes Document darstellt. Ist dann wohl nicht so... die XPath-Pfade müssen trotzdem aus Sicht des ganzen Documents angegeben werden.
Ok, ich werd versuchen mir das zu merken ;-)
Gruß,
Harlequin