AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi XML - nextSibling - übergeordnet ?

XML - nextSibling - übergeordnet ?

Ein Thema von user0815 · begonnen am 17. Okt 2007 · letzter Beitrag vom 19. Nov 2007
Antwort Antwort
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
Neuromancer

Registriert seit: 8. Aug 2003
62 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: XML - nextSibling - übergeordnet ?

  Alt 15. Nov 2007, 15:35
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:
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ß
  Mit Zitat antworten Zitat
Benutzerbild von user0815
user0815

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

Re: XML - nextSibling - übergeordnet ?

  Alt 19. Nov 2007, 10:10
THX @Neuromancer,

ja das konnte ich noch gebrauchen.
Funktioniert wunderbar !
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz