2012-04-02 8 views
0

Ich habe einen XmlString, der mehrere Elemente mit ihren Knoten enthält.Wie kann ich auf die Werte für untergeordnete Knoten in meinem XML-Dokument zugreifen?

dh

<Element> 
    <AccountName>My Account Name</AccountName> 
    <FullName>Edward Jones</FullName> 
</Element> 

kann ich die Knotennamen, dh Zugriff auf Kontonamen, Fullname, aber ich die Werte nicht zugreifen können, oder sie kehren leer. Hier ist mein Code.

Doc : IXMLDocument; 
begin 
    Doc := XMlDoc.LoadXMLData(XmlString); 
    Doc.DOMDocument.getElementsByTagName('Element').length; // = 11 
    Doc.DOMDocument.getElementsByTagName('Element').item[2].childNodes[0].nodeName; // = AccountName 
    Doc.DOMDocument.getElementsByTagName('Element').item[2].childNodes[0].nodeValue; 
end; 

Es gibt 11 Instanzen des ‚Element‘ in meinem xmlString so diese auscheckt, die nodeName = Konto das ist, was ich erwarte. Aber der nodeValue ist leer. Gibt es eine andere Möglichkeit, die Werte zu ziehen? Weiß jemand, warum die Knotenwerte leer sind?

Antwort

2

Eine Vermutung: Es sieht wie Standard-DOM-API aus, so dass Sie einen Textknoten unter den Elementknoten haben könnten.

Doc.DOMDocument.getElementsByTagName('Element').item[2].childNodes[0].childNodes[0].nodeValue; 
+0

Dank, dass der Trick! – Trevor

3

Sie fallen den ganzen Weg auf die Low-Level-DOM-Ebene. In dieser Hinsicht ist die Antwort von @ MizardX korrekt - der Text ist in seinem eigenen untergeordneten Knoten enthalten, auf den Sie direkt zugreifen müssen. Da Sie jedoch IXMLDocument verwenden, müssen Sie nicht so weit fallen. Die IXMLNode Schnittstelle ist höher und versteckt sich diese Angaben von Ihnen, einen einfacheren Zugang zu den Knoten und deren Daten, zB:

var 
    Doc : IXMLDocument; 
    ElementNode, AccountNameNode, FullNameNode : IXMLNode; 
    Count: Integer; 
    NodeName, NodeText: String; 
begin 
    Doc := LoadXMLData(XmlString); 
    ElementNode := Doc.DocumentElement; 
    Count := ElementNode.ChildNodes.Count; // = 2 

    AccountNameNode := ElementNode.ChildNodes[0]; 
    NodeName := AccountNameNode.NodeName; 
    NodeText := AccountNameNode.Text; 

    FullNameNode := ElementNode.ChildNodes[1]; 
    NodeName := FullNameNode.NodeName; 
    NodeText := FullNameNode.Text; 
end;