Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi OpenXML - NodeValues auslesen funktioniert nicht (https://www.delphipraxis.net/92564-openxml-nodevalues-auslesen-funktioniert-nicht.html)

slemke76 22. Mai 2007 11:34


OpenXML - NodeValues auslesen funktioniert nicht
 
Hallo,

ich verwende folgenden Source, um NodeValues auszulesen:

Delphi-Quellcode:
  uses XDom_4_1;

  .......

  DomImplementation1:=TDomImplementation.create(self);
  XmlToDomParser1:=TXmlToDomParser.create(self);
  XmlToDomParser1.DOMImpl:=DomImplementation1;
  Doc := XmlToDomParser1.ParseFile(AppDataDir +  '\Devices.xml', false);

  List:=Doc.getElementsByTagName('Device');
  if Assigned(List) and (List.length>0) then
    for i := 0 To List.length -1 do begin
      SubList:=List.item(i).childNodes;
      for j:=0 to SubList.length-1 do begin
        ShowMessage(Sublist.Item(j).NodeName+': '+SubList.Item(j).NodeValue);
      end;
    end;

  XmlToDomParser1.Free;
  DomImplementation1.Free;
In der Anzeige erscheint zwar der korrekte NodeName (z.B. "Address"), aber die NodeValue ist leer ?
Was mache ich falsch ?

Anbei noch das XML:

XML-Code:
<?xml version="1.0" encoding="UTF-8"?>
<XI>
  <Devices>
    <Device serial="339362">
      <Address>1</Address>
      <Name>Gesamt</Name>
      <Berechnet>0</Berechnet>
    </Device>
  </Devices>
</XI>
Danke,
Sebastian

slemke76 23. Mai 2007 08:31

Re: OpenXML - NodeValues auslesen funktioniert nicht
 
Hallo zusammen,

ich habe es inzwischen gefunden.
In DOM wird wohl *alles* als eigenes Objekt behandelt, also auch der Text. Funktionieren tut es nun so:

Delphi-Quellcode:
uses XDom_4_1;

  .......

  DomImplementation1:=TDomImplementation.create(self);
  XmlToDomParser1:=TXmlToDomParser.create(self);
  XmlToDomParser1.DOMImpl:=DomImplementation1;
  Doc := XmlToDomParser1.ParseFile(AppDataDir +  '\Devices.xml', false);

  List:=Doc.getElementsByTagName('Device');
  if Assigned(List) and (List.length>0) then
    for i := 0 To List.length -1 do begin
      SubList:=List.item(i).childNodes;
      for j:=0 to SubList.length-1 do begin
        if (SubList.Item(j).HasChildNodes) then
          if (Sublist.Item(j).childNodes.item(0).NodeName='#text') then begin
            key:=lowercase(Sublist.Item(j).NodeName); value:=SubList.Item(j).childNodes.item(0).NodeValue;
            ShowMessage(key+': '+value);
          end;
      end;
    end;

  XmlToDomParser1.Free;
  DomImplementation1.Free;
Wichtig sind diese Zeilen:

Delphi-Quellcode:
        if (SubList.Item(j).HasChildNodes) then
          if (Sublist.Item(j).childNodes.item(0).NodeName='#text') then begin
            key:=lowercase(Sublist.Item(j).NodeName); value:=SubList.Item(j).childNodes.item(0).NodeValue;
            ShowMessage(key+': '+value);
          end;
Vielleicht hilfts ja jemanden.

lg

marabu 23. Mai 2007 09:19

Re: OpenXML - NodeValues auslesen funktioniert nicht
 
Hallo Sebastian,

es ist manchmal sauberer mit Elementen zu arbeiten:

Delphi-Quellcode:
procedure TDemoForm.ButtonClick(Sender: TObject);
var
  doc: TDomDocument;
  nl: TDomNodeList;
  e: TDomElement;
  i: Integer;
begin
  with OpenDialog do
    if Execute then
    begin
      doc := XmlToDomParser.FileToDom(FileName);

      nl := doc.getElementsByTagName('Device');
      for i := 0 to Pred(nl.length) do
      begin
        e := nl.item(i).FindFirstChildElement;
        while Assigned(e) do
        begin
          ShowMessage(Format('%s: "%s"', [e.TagName, e.TextContent]));
          e := e.FindNextSiblingElement;
        end;
      end;
      doc.Free;
    end;
end;
Die von dir entdeckten Textknoten sind eigentlich Enkel und keine Kinder, aber das geht bei dem Zugriff über childNodes verloren.

Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:49 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