Harlequin: [C#] selektieren mit XPATH

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:

xml<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

--
RIP --- XHTML 2
nur die Besten sterben jung
  1. Hi!

    xml<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!

    1. 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

      --
      RIP --- XHTML 2
      nur die Besten sterben jung
      1. 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!

        1. 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

          --
          RIP --- XHTML 2
          nur die Besten sterben jung
          1. 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

            --
            Warum nennt sich Andreas hier MudGuard?
            O o ostern ...
            Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
            1. 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

              --
              RIP --- XHTML 2
              nur die Besten sterben jung