Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi HILFE!!! MSXML 4.0 (https://www.delphipraxis.net/6538-hilfe-msxml-4-0-a.html)

wk_one 14. Jul 2003 14:48


HILFE!!! MSXML 4.0
 
Hi ich möchte eine XML-Datei auslesen. Dazu verwende ich MSXML4.0.

Wie kann ich auf die Attribute der ChildNodes zugreifen?


Die Datei die ich auslesen möchte sieht in etwa so aus:
Delphi-Quellcode:
<?xml version="1.0"?>
<MODULE name="Module1" version="1.0">
  <LESSON name="Lektion1" beschreibung="bla bla">
    <TOPIC name="Uebung1" href="c:/irgendwas/"/>
    <TOPIC name="Uebung2" href="c:/irgendwas/"/>
    <TOPIC name="Uebung3" href="c:/irgendwas/"/>
    <TOPIC name="Uebung4" href="c:/irgendwas/"/>
  </LESSON>
  <LESSON name="Lektion2" beschreibung="bla bla">
    <TOPIC name="Uebung1" href="c:/irgendwas/"/>
    <TOPIC name="Uebung2b" href="c:/irgendwas/"/>
    <TOPIC name="Uebung3b" href="c:/irgendwas/"/>
    <TOPIC name="Uebung4b" href="c:/irgendwas/"/>
  </LESSON>
</MODULE>
ich möchte nun auf die Attribute der Nodes <MODULE>,<LESSON> und <TOPIC> zugreifen.

Auf die Attribute der ersten Node komme ich so:
Delphi-Quellcode:
var
  xmlDoc : IXMLDOMDocument2;
...
...
...
Stringvariable := xmlDoc.documentElement.getAttribute('name');
das geht ja leider nicht mehr.
Delphi-Quellcode:
Stringvariable := xmlDoc.documentElement.childNodes[i].getAttribute('name');

Kann mir jemand helfen?

MathiasSimmack 14. Jul 2003 15:09

Re: HILFE!!! MSXML 4.0
 
Delphi-Quellcode:
nl1 := xmldoc.selectNodes('MODULE/LESSON/TOPIC/@name');
nl2 := xmldoc.selectNodes('MODULE/LESSON/TOPIC/@href');

if(nl1.length > 0) and
  (nl2.length > 0) and
  (nl1.length = nl2.length) then
for i := 0 to nl1.length - 1 do
  ShowMessage(Format('%s = %s',
  [nl1.item[i].Get_nodeValue,nl2.item[i].Get_nodeValue]));
nl1 und nl2 sind vom Typ IXMLDOMNodeList.

MathiasSimmack 14. Jul 2003 15:14

Re: HILFE!!! MSXML 4.0
 
Noch genialer :wink:
Delphi-Quellcode:
nl1 := xmldoc.selectNodes('MODULE/LESSON[@name="Lektion1"]/TOPIC/@name');
nl2 := xmldoc.selectNodes('MODULE/LESSON[@name="Lektion1"]/TOPIC/@href');
Damit greifst du gezielt nur auf den LESSON-Knoten zu, dessen name-Attribut "Lektion1" ist. Auf die gleiche Weise kannst du dann auch den anderen einlesen.

wk_one 14. Jul 2003 16:47

Re: HILFE!!! MSXML 4.0
 
Danke :D .

Ich hab nach irgendwelchen Methoden gesucht über die man gehen kann.

Der Parameter in der Methode
Delphi-Quellcode:
selectNodes()
ist wohl sowas wie ein Abfragestring. Gibt es irgendwo eine Beschreibung wie dieser auszusehen hat?

Das Ergebnis ist ein Nodelist Objekt.
Wie kann ich dann den Wert des Attributs "name" als String erhalten?

MathiasSimmack 14. Jul 2003 18:27

Re: HILFE!!! MSXML 4.0
 
Wenn du das XML-4-SDK von Microsoft installiert hast, dann müsste eine Hilfedatei dabei sein. Ansonsten wirst du auch im PSDK unter dem Eintrag "Data Services" fündig. Ich habe leider den genauen Link (bzw. die genaue Hilfeseite) nicht im Kopf, aber da standen irgendwo ein paar Beispiele drin.

Ansonsten verstehe ich deine Frage nicht so ganz. Wenn du meinen Beispielcode ausprobiert hast, dann siehst du doch den Inhalt der jeweiligen name-Attribute:
Delphi-Quellcode:
ShowMessage(Format('%s = %s',
  [nl1.item[i].Get_nodeValue,nl2.item[i].Get_nodeValue]));
(nl.item[i].Get_nodeValue). "Get_nodeValue" liefert in diesem Fall den Wert von "name", weil du oben -mit dem von dir so genannten "Abfragestring" :wink:- direkt auf das Attribut zugegriffen hast:
Code:
MODULE/LESSON/TOPIC[b]/@name[/b]
Oder meinst du was anderes?


Nachtrag: Du findest ein paar Hinweise und Beispiele in der schon erwähnten XML-Hilfedatei bzw. im PSDK unter "Data Services -> MSXML 4.0 SDK -> XPath's Developers Guide" (bzw. XPath Reference).

wk_one 15. Jul 2003 10:57

Re: HILFE!!! MSXML 4.0
 
nein, war schon genau richtig.
Super :hello: , hat mir echt ein Stück weitergeholfen.
die einzige Änderung die ich vornehmen musste war anstatt
Delphi-Quellcode:
nl1.item[i].Get_nodeValue
Delphi-Quellcode:
nl1.item[i].nodeValue
sonst hat alles bestens funktioniert.

:lol: Viiiiiieeeelen Dank. :D


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz