XPath

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

XPath

Beitrag von Tafkadasom2k5 »

Hiho!
Hat irgendjemand eine Ahnung von XPath? Ich komme mitlerweile soweit klar, dass

Code: Alles auswählen

"book[title='Midnight Rain']/price"
mir den Node auswählt, der widerum ein Childnode mit dem Namen "Title" und dem Inhalt "Midnight Rain hat".

Code: Alles auswählen

<content>
  <book id="bk102">
        <author>Ralls, Kim</author>
        <title>Midnight Rain</title>
        <genre>Fantasy</genre>
   </book>
</content>
Nur jetzt versuche ich gerade irgendwie durch Attribute mein Dokument zu durchforsten. Es würde auch reichen, wenn ich einfach alle <entry> nodes durchblättern könnte. In der WC3 Recommendation steht etwas wie

Code: Alles auswählen

child::para[position()=1]
.

Doch meine Umsetzung auf

Code: Alles auswählen

/content::book[position()=1]
bringt mir irgendwie nur einen "Error 48"...

Am Besten wäre natürlich, wenn ich über die Attribute meine Nodes auswählen könnte, UND mit "position()=x" herum'surfen' könnte...

Kann mir da irgendjemand weiterhelfen..?

Gr33tz
Tafkadasom2k5
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: XPath

Beitrag von Kiffi »

> Hat irgendjemand eine Ahnung von XPath?

XPath in XSL? Oder mit der MSXML3-Lib aus den PBOSL?

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

XML 4. Ohne PBOSL (deshalb auch 'andere Srachen').

Aber XPath ist ja überall gleich, wenn ich das Prinzip richtig verstehe..?

/Edit: Ich spreche also die DOM-Objekte über COM an.

Gr33tz
Tafkadasom2k5
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> Aber XPath ist ja überall gleich, wenn ich das Prinzip richtig verstehe..?

generell: ja.

In PB hätte ich Dir allerdings zeigen können, wie man mit Nodelisten arbeitet. ;-)

Welche Sprache verwendest Du?

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

Da ich mich auf der Arbeit befinde Power Basic. (Auch wenn mir diese Sprache mittlerweile auch schon mehr zusagt als anfangs ^^).

Die Include sieht ungefähr so aus:

Code: Alles auswählen

INTERFACE DISPATCH Msxml2DOMDocument
    MEMBER GET nodeName<&H00000002>() AS STRING
    MEMBER GET nodeValue<&H00000003>() AS VARIANT
    MEMBER LET nodeValue<&H00000003>()   'Parameter Type As Variant
    MEMBER GET nodeType<&H00000004>() AS Msxml2DOMNodeType
    MEMBER GET parentNode<&H00000006>() AS Msxml2IXMLDOMNode
    [...]
END INTERFACE
Falls du meine Funktion benötigst, hier ein kleiner Ausschnitt:

Code: Alles auswählen

      SET oDocument = NEW DISPATCH IN "Msxml2.DOMDocument.4.0"
      IF ISFALSE ISOBJECT(oDocument) THEN ERROR 201
      
      vFile = sFile 'Da steht der Dateiname drinne
      OBJECT CALL oDocument.load(vFile)
      
      vSearch = sXML_Path 'Da steht der XPath drinne content::book[position()=1]
      OBJECT GET oDocument.documentElement.selectNodes(vSearch) TO vRes
      SET oNodeList = vRes
      vIdx=0
      OBJECT GET oNodeList.item(vIdx).TEXT TO vRes
      FUNCTION = VARIANT$(vRes)
Gr33tz
Tafkadasom2k5
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> Da ich mich auf der Arbeit befinde Power Basic.

Öärks! ;-)

naja, aus der Syntax heraus meine ich zu erkennen, dass die
Vorgehensweise ähnlich der in PB ist. Vom Prinzip her geht das so:

Du selektierst anhand des XPath im DomDocument einen Teilbereich
Deines XML. Je nach erwartetem Ergebnis bekommst Du entweder ein
einzelnes Item (Node) oder eine Liste von Items (NodeList).

Dein XPath liefert Dir ein einzelnes Node zurück; nämlich das 'book' an
Position 1. Aus diesem Grund würde ich das Ergebnis nicht in einer
NodeList speichern, sondern in ein Node. Der Xpath könnte dann auch
insofern vereinfacht werden, dass Du ihn so schreibst: "//book". Dieser
würde dann das erste 'book' finden (sofern vorhanden) und zurückliefern.

(ich habe jetzt mal '//' angegeben, weil ich Dein XML nicht kennen.
Ratsamer ist es, wenn Du anstelle des '//' den kompletten Pfad
spezifizierst)

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

Kiffi hat geschrieben: Öärks! ;-)
Wasn..? :wink:

Mein XML-Dokument:

Code: Alles auswählen

<?xml version="1.0"?>
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications
      with XML.</description>
   </book>
   <book id="bk102">
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-12-16</publish_date>
      <description>A former architect battles corporate zombies,
      an evil sorceress, and her own childhood to become queen
      of the world.</description>
   </book>
   <book id="bk103">
      <author>Corets, Eva</author>
      <title>Maeve Ascendant</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-11-17</publish_date>
      <description>After the collapse of a nanotechnology
      society in England, the young survivors lay the
      foundation for a new society.</description>
   </book>
</catalog>
So. Und ich möchte jetzt anhand der ID (z.B. id="bk102") den jeweiligen Node auswählen. Das Problem das du ansprichst ist durch Folgendes zu begründen:
Meine MSXML4 Include hat geschrieben:MEMBER CALL selectNodes<&H0000001D>(IN queryString AS STRING<&H00000000>) AS Msxml2IXMLDOMNodeList
.

Also ergibt sich ungefähr folgender

Code: Alles auswählen

      sXML_Path = "HIER BENÖTIGE ICH HILFE....."
      vSearch = sXML_Path
      OBJECT GET oDocument.documentElement.selectNodes(vSearch) TO vRes
      SET oNodeList = vRes
       OBJECT GET oNodeList.item(vIdx).TEXT TO vRes 
       'Da ist der Node versteckt, ich habe den Zwischenschritt also ausgelassen... und mir damit eine Dom-Node Variable erspart
       FUNCTION = VARIANT$(vRes)
Wie kann ich jetzt diesen Node auswählen, indem ich die ID eingebe? Wie muss der XPath lauten..?
So "book[title='Midnight Rain']/price" funktioniert er ja schon gut.
Aber ich will jetzt an das Attribut "ID" herankommen, und nicht über den Titel.

Gr33tz
Tafkadasom2k5
(Und Danke für deine Bemühungen fürs Erste :) )
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> Wasn..? ;-)

och, nur so... ;-)

ok, mir ist gerade noch was eingefallen:

Standardmässig steht die SelectionLanguage-Eigenschaft des MSXML-Doms
auf XSLPattern. Damit kann man zwar einfache XPath-Selektionen
vornehmen, allerdings nicht auf Achsen ('::') zugreifen.

Stell mal mit oDocument.putProperty() die SelectionLanguage auf XPath.
Dann sollte Deine ursprüngliche Abfrage keinen Fehler mehr werfen.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

Mh.. danke, das wäre natürlich logisch... aber..

Code: Alles auswählen

SET oDocument = NEW DISPATCH IN "Msxml2.DOMDocument.4.0"
..und ein "Msxml2.DOMDocument.4.0" hat leider keine "putProperty" Methode...
Das "Msxml2IVBSAXXMLReader"-Object besitzt so eine Methode, aber ich kann dieses Objekt irgendwie bisher nicht erzeugen...

Was kann man da machen..?
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

sorry, nicht putProperty, sondern setProperty:

Code: Alles auswählen

oDocument.setProperty("SelectionLanguage", "XPath")
Grüße ... Kiffi
a²+b²=mc²
Antworten