Einzelnen Beitrag anzeigen

Benutzerbild von user0815
user0815

Registriert seit: 5. Okt 2007
331 Beiträge
 
Delphi XE2 Professional
 
#1

XML - nextSibling - übergeordnet ?

  Alt 17. Okt 2007, 13:25
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
  Mit Zitat antworten Zitat