Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi bestimmte XML-Nodes auslesen (https://www.delphipraxis.net/71982-bestimmte-xml-nodes-auslesen.html)

Susanne 23. Jun 2006 09:02


bestimmte XML-Nodes auslesen
 
ich hab bisher noch nicht viel mit XML gemacht und scheitere im Moment ein bisschen, wäre daher sehr nett, wenn ihr mir ein wenig helfen würdet.
meine xml-Struktur:
Delphi-Quellcode:
   <?xml version="1.0" encoding="utf-8"?>
   <Info>
     <Export>
       <Documents>
         <Document ID="12345" Extension="xxx">
           <Indexe>
             <Index name="nr1">
               <Gefundene Count="1">
                 <Gefunden>hallo</Gefunden>
               </Gefundene>
             </Index>
           </Indexe>
         </Document>
         <Document ID="23456" Extension="xxx">
           <Indexe>
             <Index name="nr2">
               <Gefundene Count="0"/>
             </Index>
           </Indexe>
         </Document>      
       </Documents>
       <andereNode>
         <Node Name="testnr">Test</Node>
         <Node Name="testnr2">Test2</Node>
       </andereNode>
     </Export>
   </Info>
Mein Problem besteht nun darin, dass ich an ein bestimmtes Attribut eines Knoten kommen möchte und zwar "ID= " und wenn ich dann das richtige gefunden habe (dieses kommt mehrmals vor) dann möchte ich Index Name= auslesen und wenn Value <> 0 ist, dann auch Values auslesen.

Ich benutze in Delphi XMLDoc und XMLIntf und msxml2_TLB

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  xmlDomdoc    : DomDocument40;
  domNodelist  : IXMLDomNodelist;
  domNode      : IXMLDomNode;
  i            : integer;
begin
  xmlDomDoc:= CoDomDocument40.Create;
  xmlDomDoc.load('D:\dev\Schillig\-XMLArchiver\Daten\export.xml');
  domNodelist := xmlDomDoc.documentElement.selectNodes
('//Export/Documents/Document/');
  for i := 0 to domNodelist.length - 1 do
  begin
    domNode:= domNodeList.item[i];
    ShowMessage(domNode.nodeName);

    if DomNode <> nil then
    begin

    //aber wie komme ich hier an das Attribut?
   
    end;
    domNode := DomNode.NextSibling; // zum nächsten Knoten auf der Ebene    
  end;
end;
Vielen Dank schon mal.
Susanne

marabu 23. Jun 2006 20:59

Re: bestimmte XML-Nodes auslesen
 
Hallo Susanne,

vielleicht hilft dir das ein Stück auf deinem Weg:

Delphi-Quellcode:
procedure TWebForm.DemoButtonClick(Sender: TObject);
var
  i: Integer;
  doc: IXMLDOMDocument2;
  nl: IXMLDOMNodeList;
  n: IXMLDOMNode;
begin
  doc := CoDomDocument40.Create;
  doc.async := False;
  if doc.load('c:\daten\dp\info.xml') then
  begin
    nl := doc.selectNodes('//Document');
    for i := 0 to Pred(nl.length) do
    begin
      n := nl.item[i];
      n := n.attributes.getNamedItem('ID');
      ShowMessage(VarToStr(n.nodeValue));
    end;
  end;
end;
Grüße vom marabu

Luckie 25. Jul 2006 10:21

Re: bestimmte XML-Nodes auslesen
 
Ich muss mich da mal dranhängen. Ich habe folgendes XML Dokument:
XML-Code:
<importkennungen>
 <zeitraum jahr="2006">
    <doktyp kennung="11A13">
      <ziel print="true">(#DATAWERK)\AUSGHEIN</ziel>
    </doktyp>

    <doktyp kennung="11A14">
      <ziel>(#BUNG06)\AUSGNUNG</ziel>
    </doktyp>

    <doktyp kennung="11B14">
      <ziel>(#BUNG06)\EINGNUNG</ziel>
    </doktyp>

    <doktyp kennung="11B01" MapField="Vorgang" fromChar="0" Length="5" FormularFilter="WEAR" SearchFieldName="Vorgang">
      <ziel>(#BUNG06)\EINGNUNG</ziel>
    </doktyp>

    <doktyp kennung="EB" MapField="BA" fromChar="0" Length="2" FormularFilter="KOAU" SearchFieldName="Rg-Nr">
      <ziel>(#BUNG06)\EINGNUNG</ziel>
    </doktyp>

    <doktyp kennung="ZV" MapField="BA" fromChar="0" Length="2" FormularFilter="KOAU" SearchFieldName="Belegnummer">
      <ziel>(#BUNG06)\EINGNUNG</ziel>
    </doktyp>

  </zeitraum>
</importkennungen>
zeitraum kann auch 2003 oder 2004 oder so sein. Das ist nur ein Auschnitt. Ich will jetzt alle Unterknoten itterieren, die sich unterhalb eines Zeitraumes mit einem bestimmten Jahr befinden:
Delphi-Quellcode:
    s := Format('//zeitraum[@jahr="%s"]', [Year]); //Year = 2006
    Nodes := FXMLDoc.selectNodes(s);
    for i := 0 to Nodes.length - 1 do
    begin
      Node := Nodes.item[i];
      s := Node.selectSingleNode('doktyp/@kennung').nodeValue;
      DebugLog('Knoten', s);
    end;
Nutr leider ist Nodes-length = 1, sollte aber sechs sein.

marabu 25. Jul 2006 11:45

Re: bestimmte XML-Nodes auslesen
 
Hallo Michael,

Zitat:

Zitat von Luckie
Nur leider ist Nodes-length = 1, sollte aber sechs sein.

Eins ist korrekt - wenn du Sechs willst, dann probier es mal so:

XML-Code:
xPath := '//zeitraum[@jahr="2006"]/doktyp';
Grüße vom marabu

Jelly 25. Jul 2006 11:57

Re: bestimmte XML-Nodes auslesen
 
Leider besitzt keiner von euch ein Delphi 2006 (mich eingeschlossen), aber vielleicht kennt Ihr jemanden... Dort gibts jedenfalls den XML Import Wizard, der die XML Struktur ausliest, und im Gegenzug ganz nette Klassen und Interfaces anlegt, mit denen man wirklich ganz bequem mit XML hantieren kann... Meine ersten Gehversuche damit sind hier erfolgreich geschildert. Also ein Blick lohnt es auf jeden Fall.

Luckie 25. Jul 2006 12:40

Re: bestimmte XML-Nodes auslesen
 
Zitat:

Zitat von marabu
XML-Code:
xPath := '//zeitraum[@jahr="2006"]/doktyp';
Grüße vom marabu

Ja, genau das war es. ;)


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