Tom Wieczorek: XPath: Nodes mit unterschiedlichen Namen auswählen?

Hallo allerseits,

folgendes Problem anhand eines Beispiels:

<a>
  <b>foo</b>
  <b>bar</b>
  <c>bla</c>
  <unwanted>Böse Daten ;)</unwanted>
  <b>baz</b>
</a>

Ich habe ein MS XML 3.0 DOMDocument und möchte nun über die selectNodes-Methode an alle b's und c's in a ran. Wie geht das (mit dem MS XML Parser 3.0)? Wichtig ist vor allem die Reihhenfolge der Elemente, so dass 2 XPath-Abfragen à la "a/b" und "a/c" nicht funktionieren. Ich könnte nun alle childNodes durchlaufen und den baseName überprüfen, aber ich bin mir sicher, dass es auch eine nette XPath-Variante gibt. Setze mich erst seit kurzem mit diesem Thema auseinander und wäre daher auch dankbar für Links zu XML/XPath und Konsorten, die nicht so sehr auf XSLT fokussiert sind.

Ich habe da was von der XPath-Funktion name() gelesen und dachte mir, dass vielleicht folgendes funktionieren könnte: "a/*[name() = 'b' or name() = 'c']" Aber hierbei erklärt der MS-Parser mir, dass die Funktion name() unbekannt ist (was er übrigens von jeder Funktion behauptet).

Danke für Eure Hilfe!

Ciao
Tommy

  1. Hallo,

    folgendes Problem anhand eines Beispiels:

    <a>
      <b>foo</b>
      <b>bar</b>
      <c>bla</c>
      <unwanted>Böse Daten ;)</unwanted>
      <b>baz</b>
    </a>

    Ich habe ein MS XML 3.0 DOMDocument und möchte nun über die selectNodes-Methode an alle b's und c's in a ran. Wie geht das (mit dem MS XML Parser 3.0)?

    Du hast die Methode setProperty benutzt? z.B.
    xmlDoc.setProperty("SelectionLanguage", "XPath");
    selection = xmlDoc.selectNodes("/a//b");
    Bzw. bist du dich sicher das deine XPath-Ausdruck richtig (d.h. es trifft auf Knoten) ist?

    Wichtig ist vor allem die Reihhenfolge der Elemente, so dass 2 XPath-Abfragen à la "a/b" und "a/c" nicht funktionieren. Ich könnte nun alle childNodes durchlaufen und den baseName überprüfen, aber ich bin mir sicher, dass es auch eine nette XPath-Variante gibt.

    Ich versthe nicht was du erreichen möchtest und so ist es auch schwer zu sagen wie du dahin kommst.

    Setze mich erst seit kurzem mit diesem Thema auseinander und wäre daher auch dankbar für Links zu XML/XPath und Konsorten, die nicht so sehr auf XSLT fokussiert sind.

    Wiederum verstehe ich dich nicht.
    http://aktuell.de.selfhtml.org/links/xml.htm
    http://aktuell.de.selfhtml.org/links/xml_derivate.htm
    http://www.vbxml.com/

    Ich habe da was von der XPath-Funktion name() gelesen und dachte mir, dass vielleicht folgendes funktionieren könnte: "a/*[name() = 'b' or name() = 'c']" Aber hierbei erklärt der MS-Parser mir, dass die Funktion name() unbekannt ist (was er übrigens von jeder Funktion behauptet).

    Das könnte vielleicht mit "SelectionLanguage" zusammenhängen.
    Aber ein wenig mehr von deinem Code wäre für eine bessere Hilfe nicht so schlecht.

    Grüße
    Thomas

    1. Du hast die Methode setProperty benutzt? z.B.
      xmlDoc.setProperty("SelectionLanguage", "XPath");

      Nein, habe ich nicht! Wow, man sollte vielleicht auch mal die ganze Funktionsreferenz (z.B. von selectNodes) lesen, wenn man diese Funktion zum ersten mal benutzt *vordenkopfhau*. Mit der gesetzten Property geht jetzt alles, musste daraufhin zwar noch die "SelectNamespaces" setzen, die ich vorher auch einfach ignoriert habe, aber es geht! VIELEN DANK!!!

      Hinterhältig finde ich, dass ohne die setProperty-Anweisung einfache XPath-Statements funktionieren, man aber einen Fehler erhält, sobald man eine Funktion benutzt. ;)

      By the way, was ist denn diese XSLPattern language, die als default voreingestellt ist?

      Setze mich erst seit kurzem mit diesem Thema auseinander und wäre daher auch dankbar für Links zu XML/XPath und Konsorten, die nicht so sehr auf XSLT fokussiert sind.

      Wiederum verstehe ich dich nicht.

      Ich habe bisher nur XPath-Beispiele in XSL gesehen, und habe mich lediglich gefragt, ob es davon losgelöst auch "XSL-freie" Tutorials gibt. Ich beherrsche bisher kein XSL und finde daher die Beispiele einfach ein wenig irritierend. Womit ich ganz gut zurecht gekommen bin findet sich unter http://www.zvon.org/xxl/XPathTutorial/Output/

      Nochmals vielen Dank...

      Caio
      Tom

      1. Hallo,

        Du hast die Methode setProperty benutzt? z.B.
        xmlDoc.setProperty("SelectionLanguage", "XPath");

        Nein, habe ich nicht! [...] Mit der gesetzten Property geht jetzt alles, [...] VIELEN DANK!!!

        freut mich ;-)

        Hinterhältig finde ich, dass ohne die setProperty-Anweisung einfache XPath-Statements funktionieren, man aber einen Fehler erhält, sobald man eine Funktion benutzt. ;)

        By the way, was ist denn diese XSLPattern language, die als default voreingestellt ist?

        "Patterns" sind eine Untermenge der XPath-ausdrücke, mit einigen Beschränkungen den "normalen" XPath-Ausdücken gegenüber:
        http://www.w3.org/TR/xslt#patterns
        Allerdings das "XSLPattern language" war eine M$ interpretation (bis MSXML 3.0, ab MSXML 4.0 ist XPath automatisch die voreingestelle Abfragesprache) vom XPath mit nur wenigen Möglichkeiten der Selektion.

        Setze mich erst seit kurzem mit diesem Thema auseinander und wäre daher auch dankbar für Links zu XML/XPath und Konsorten, die nicht so sehr auf XSLT fokussiert sind.

        Wiederum verstehe ich dich nicht.

        Ich habe bisher nur XPath-Beispiele in XSL gesehen, und habe mich lediglich gefragt, ob es davon losgelöst auch "XSL-freie" Tutorials gibt. Ich beherrsche bisher kein XSL und finde daher die Beispiele einfach ein wenig irritierend. Womit ich ganz gut zurecht gekommen bin findet sich unter http://www.zvon.org/xxl/XPathTutorial/Output/

        Verstehe.
        Es kommt ja davon, dass XPath eine Unterspreche von XSLT ist, kann aber auch unabhängig davon verwendet werden (so wie du es ja willst). Deswegen ist auch die Vermischung.
        Du kannst dir http://www.informatik.hu-berlin.de/~obecker/obqo/w3c-trans/xpath-de/ durchlesen ;-)
        Natürlich sind auch http://de.selfhtml.org/xml/darstellung/xpathsyntax.htm und http://de.selfhtml.org/xml/darstellung/xpathfunktionen.htm zu erwähnen (ja, da wird XSLT auch verwendet, aber qusi nur um die XPath "Sachen" zu demonstrieren).

        Grüße
        Thomas

  2. Hi,

    Ich habe ein MS XML 3.0 DOMDocument und möchte nun über die selectNodes-Methode an alle b's und c's in a ran. Wie geht das (mit dem MS XML Parser 3.0)? Wichtig ist vor allem die Reihhenfolge der Elemente, so dass 2 XPath-Abfragen à la "a/b" und "a/c" nicht funktionieren. Ich könnte nun alle childNodes durchlaufen und den baseName überprüfen, aber ich bin mir sicher, dass es auch eine nette XPath-Variante gibt.

    Hm - bei XSLT wäre es select="a/b|a/c" (oder ist es select="a/b|c"? Hab schon länger nix mehr gemacht).

    cu,
    Andreas

    --
    MudGuard? Siehe http://www.Mud-Guard.de/
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.