Hallo,
ich habe da ein
XML Problem.
Die
XML Datei befindet sich im Anwendungsverzeichnis - als Kommentar hier im Quellcode.
Den Aufbau der XML Datei kann ich nicht beeinflussen!
Den einzigen Parameter den ich zum Auslesen zur Verfügung habe ist
ZWEI.
Zu diesem Eintrag gebe ich alle vorhandenen "eintragstext" aus.
Frage:
Wie es möglich vom
gesuchten NODE aus die übergeordneten Werte:
<eintrag TYP="222" EXTRA="987">
<element>654</element>
<ebene ID="321">
auszugeben ?
siehe edit 1
Frage:
Ist Node.nextSibling.text die richtige Wahl oder kann man auch über die Attribute gehen ?
Delphi-Quellcode:
uses
MSXML2_TLB,
ActiveX;
procedure TForm1.Button1Click(Sender: TObject);
var
XMLDoc : IXMLDOMDocument2;
NodeList : IXMLDOMNodeList;
Node : IXMLDOMNode;
i : Integer;
Suche :
String;
begin
CoInitialize(
nil);
Suche := '
ZWEI';
XMLDoc := CoDOMDocument40.Create;
XMLDoc.load('
test.xml');
Memo1.Lines.Append(XMLDoc.xml);
{
<?xml version="1.0" encoding="ISO-8859-1" ?>
<Test>
<titel>Überschrift</titel>
<eintrag TYP="111" EXTRA="123">
<element>456</element>
<ebene ID="789">
<stichwort>EINS</stichwort>
<dreck>den</dreck>
<eintragstext INHALT="TEXT1">Diesen Inhalt nicht 1</eintragstext>
<eintragstext INHALT="TEXT2">Diesen Inhalt nicht 2</eintragstext>
<eintragstext INHALT="TEXT3">Diesen Inhalt nicht 3</eintragstext>
</ebene>
</eintrag>
<eintrag TYP="222" EXTRA="987">
<element>654</element>
<ebene ID="321">
<stichwort>ZWEI</stichwort>
<dreck>hier</dreck>
<eintragstext INHALT="TEXT1">Inhalt Text 1</eintragstext>
<eintragstext INHALT="TEXT2">Inhalt Text 2</eintragstext>
<eintragstext INHALT="TEXT3">Inhalt Text 3</eintragstext>
</ebene>
</eintrag>
<eintrag TYP="1212" EXTRA="9898">
<element>6565</element>
<ebene ID="258">
<stichwort>DREI</stichwort>
<dreck>nicht</dreck>
<eintragstext INHALT="TEXT1">Diesen Inhalt nicht 1</eintragstext>
<eintragstext INHALT="TEXT2">Diesen Inhalt nicht 2</eintragstext>
<eintragstext INHALT="TEXT3">Diesen Inhalt nicht 3</eintragstext>
</ebene>
</eintrag>
</Test>
}
NodeList := xmlDoc.documentElement.selectNodes('
/Test/eintrag/ebene');
for i := 0
to NodeList.length -1
do
begin
Node := NodeList.item[i].selectSingleNode('
stichwort');
if Node.Text = Suche
then
begin
Memo1.Lines.Append('
Stichwort: ' + Node.Text);
Memo1.Lines.Append('
');
Node := NodeList.item[i].selectSingleNode('
eintragstext');
Memo1.Lines.Append(Node.text);
Memo1.Lines.Append(Node.nextSibling.text);
Memo1.Lines.Append(Node.nextSibling.nextSibling.text);
Memo1.Lines.Append('
-----------------------------------');
// edit 1
Node := NodeList.item[i].parentNode.selectSingleNode('
@EXTRA');
Memo1.Lines.Append('
EXTRA=' + Node.text);
Node := NodeList.item[i].parentNode.selectSingleNode('
element');
Memo1.Lines.Append('
element=' + Node.text);
Node := NodeList.item[i].parentNode.selectSingleNode('
ebene/@ID');
Memo1.Lines.Append('
ID=' + Node.text);
// edit 1
break;
end;
end;
if XMLDoc <>
nil
then XMLDoc :=
nil;
CoUninitialize;
end;
Als Ausgabe erhalte ich:
Zitat:
Stichwort: ZWEI
Inhalt Text 1
Inhalt Text 2
Inhalt Text 3
-----------------------------------
EXTRA=987 // edit 1
element=654 // edit 1
ID=321 // edit 1
Bleibt immer noch meine 2te Frage: Kann ich auf ein Node über das Attribut zugreifen ?
ich danke schonmal für euer bemühen
user0815