Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi XML - nextSibling - übergeordnet ? (https://www.delphipraxis.net/101688-xml-nextsibling-uebergeordnet.html)

user0815 17. Okt 2007 14:25


XML - nextSibling - übergeordnet ?
 
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

Neuromancer 15. Nov 2007 16:35

Re: XML - nextSibling - übergeordnet ?
 
Hallo,

ich weiß jetzt nicht, ob ich deine Frage richtig verstanden habe und die Antwort kommt vielleicht ein wenig spät, aber warum lässt du dir nicht einfach über XPath den gesamten Knoten zurückgeben und interierst anschließend durch die Childnodes?

In deinem Beispiel wäre das:
Delphi-Quellcode:
xmlDoc.documentElement.selectNodes('/Test/eintrag[ebene/Stichwort="ZWEI"]')
Liefert genau den/die Knoten, bei dem/denen das Stichwort = ZWEI ist.

So ersparst du dir das umständliche "Zurückgehangel" über den/die parent(s).

Gruß

user0815 19. Nov 2007 11:10

Re: XML - nextSibling - übergeordnet ?
 
THX @Neuromancer,

ja das konnte ich noch gebrauchen.
Funktioniert wunderbar !


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:58 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 by Thomas Breitkreuz