Frank aus Ulm: XPath mit XHTML Dateien immer nur 0 hits

Hi, hallo

nachdem ich fröhlich aus einem Word-Dokument ein XHTML fähiges Dokument gemacht habe (geht leider nicht mit Bordmitteln von MS Word aber über einen kleinen Umweg) möchte ich dieses Dokument parsen und eine immer wiederkehrende Sequenz von <p/><div><table></div> herausziehen.

Dazu eignet sich ja bekannterweise XPath als QueryLanguage recht gut. Allerdings bringt mir keine (nur eine) XPath Query ein ergebnis, dass Knoten gefunden wurden.

Eine Abfrage auf //p bringt 0 Hits, obwohl 22855 <p> tags drin sind. Da frage ich mich, _wieso_ zum Henker ... auch die schreibweise descendant::p hilft nicht

//* (ich will einfach jeden XML-Node haben) hingegen bringt mir 72000 hits

--- ja, ist ein recht großes Doc (ne Spec) ---

//p oder descendant::p sind aber gültige XPath Notierungen  ... ich kann das auch mit //table probieren, wieder 0 hits..

Was läuft da daneben? Hat jemand eine Idee?

Ich benutze:
VB6 bzw. VBS mit dem MS XML Parser v3
VB.net mit den MS XML v4 Core Services  (system.xml !)

Tschau und vielen Dank für Anregungen schon mal vorab.
Frank

  1. Hallo,

    Eine Abfrage auf //p bringt 0 Hits, obwohl 22855 <p> tags drin sind.

    Wie sieht deine xml und xsl aus?

    Grüße
    Thomas

    1. Hi Thomas.

      xsl nutze ich nicht, ich möchte ja nicht aus XML HTML machen, sondern ich habe aus HTML XML oder besser XHTML gemacht.

      soll ich die 2,5 MB XHTML wirklich hier posten? Interessieren dich bestimmte Bereiche?

      ich hab's gestern abend noch mit folgendem Konstrukt hinbekommen

      //*[name()='p']

      lieferte mir 22855 entsprechungen

      liegt das evt. an den Namespace-angaben, dass ich für die XPath Query noch irgendwie Namespaces mit Angeben muß.

      ich versuche es jetzt mal mit deiner anderen HTML-Datei.

      Tschau, tschüß,
      Frank

      1. Hallo Frank,

        xsl nutze ich nicht,
        liegt das evt. an den Namespace-angaben, dass ich für die XPath Query noch irgendwie Namespaces mit Angeben muß.

        Keine Ahnung, du hast nichts gesagt, außer "es geht nicht". OK du nimmst kein XSLT, aber irgendeinen Parser für die XPaht-Ausdrücke muss du nehmen. Was sagt dir die Doku dazu?
        Oder arbeitest du mit XQuery?

        Grüße
        Thomas

        1. Hi Thomas,

          Keine Ahnung, du hast nichts gesagt, außer "es geht nicht". OK du nimmst kein XSLT, aber irgendeinen Parser für die XPaht-Ausdrücke muss du nehmen. Was sagt dir die Doku dazu?
          Oder arbeitest du mit XQuery?

          ja, sorry, hatte ich anfänglich vergessen zu sagen, daß ich nix mit XSL mache. Hatte in meinem Ausgangsposting aber unten geschrieben, daß ich VB6 und .net mit den MS XML Parsern 3 und 4 verwende. Ist dir das in etwa ein Begriff?

          Der Doku vom Parser kann ich nichts annähernd treffendes entnehmen. Und ich hab jetzt so schon die 'zigste Googelei hinter mir...

          aber ich bin drauf gestoßen, was das Problem ist:

          in XHTML (in allen?) wird der HTML namespace als default definiert
          <html xmlns="http://www.w3.org/TR/REC-html40">

          http://developers.slashdot.org/developers/02/05/30/002252.shtml?tid=156

          erklärt das Problemchen ... aber gibt keine so richtige Lösung dafür :-(

          Tschau, tschüß,
          Frank aus Ulm

          1. Hallo Frank,

            Hatte in meinem Ausgangsposting aber unten geschrieben, daß ich VB6 und .net mit den MS XML Parsern 3 und 4 verwende.

            Stimmt, das  habe ich schon vergessen ;-)

            Ist dir das in etwa ein Begriff?

            Ne, müsste es das sein? ;-))

            Der Doku vom Parser kann ich nichts annähernd treffendes entnehmen. Und ich hab jetzt so schon die 'zigste Googelei hinter mir...

            Also in der SDK-Doku zu MSXML 4 gibt es sogar Beispile mit Namensräumen in der "XPath Developer's Guide" und auch in der "XPath Reference" findest du einiges.
            Deine Lösung liegt irgendwo bei local-name(), name() und namespace-uri().

            Grüße
            Thomas

            1. Moin, einen schönen Sonntag :-)

              Also in der SDK-Doku zu MSXML 4 gibt es sogar Beispile mit Namensräumen in der "XPath Developer's Guide" und auch in der "XPath Reference" findest du einiges.
              Deine Lösung liegt irgendwo bei local-name(), name() und namespace-uri().

              die XPath Reference von MS XML 4 und 3 hatte ich mir schon angeschaut, auch mit diesen "pseudo"-node funktionen habe ich experimentiert, nur das ist nicht die Lösung.

              Der XPath-Implementierung scheint irgendwie die Intelligenz zu fehlen, mit default-Namespaces richtig umzugehen, wenn mehrere Namespaces in der XML-Datei deklariert sind.

              Ich habe jetzt 3 Lösungsvarianten:

              a) ich knoble noch eine Ewigkeit an der gleichen Stelle mit dem _Bug_ herum und finde die Lösung

              b) ich nutze solches XPATH   //*[name()='p'][preceding-sibling::*[name()='div'] .... hübsch kompliziert und undurchsichtig

              c) ich füge nach der Umwandlung von HTML in XHTML eine Prozedur ein, die den String "xmlns=" durch "xmlns:html" ersetzt ... dann habe ich keinen default namespace mehr und _//p_ wird richtig interpretiert = 22855 hits

              d) ich lasse die XML-Datenauswertung dieses doch so unstrukturierten Dokumentes sein denn das komplizierteste kommt ja noch (wie aus <table> mit vielen Spalten und Zellen eine Struktur zaubern) und kopiere aus MS Word die Tabellen per Hand in MS Excel (vielleicht find ich ja irgendwie einen Trick das zu automatisieren) und importiere dann das Excelsheet in meine Datenbank

              ================

              ich hab d) genommen

              Danke dennoch vielmals für deine Hilfe, Thomas

              Tschau und einen schönen arbeitsfreien Sonntag :-)

              Frank

  2. Hi, hallo

    vielleicht sollte ich noch erwähnen:

    Ich möchte keine XSL-Transformationen an der gesuchten Sequenz vornehmen, sondern ich muß die Textinhalte daraus in eine Datenbank verfrachten, natürlich entsprechend strukturiert. Datenbankmodell steht bereits fest.

    Tschau, tschüß,
    Frank