如何访问XML文档中的子节点值?

时间:2012-04-02 16:31:04

标签: xml delphi xml-parsing delphi-2009

我有一个XmlString,其中包含多个带有节点的元素。

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

我可以访问节点名称,即AccountName,FullName,但我无法访问这些值,或者它们返回空白。这是我的代码。

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;  

我的XmlString中有11个'Element'实例,因此检查出来,nodeName = AccountName就是我所期望的。但nodeValue是空白的。还有另一种方法来拉动价值观吗?有谁知道节点值为空的原因?

2 个答案:

答案 0 :(得分:3)

您正在逐渐降低到低级DOM级别。在这方面,@ MizardX的响应是正确的 - 文本包含在您必须直接访问的自己的不同子节点中。但是,由于您使用的是IXMLDocument,因此您无需降低那么远。 IXMLNode界面位于较高位置并隐藏了您的详细信息,可以更轻松地访问节点及其数据,例如:

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;   

答案 1 :(得分:2)

猜测:它看起来像标准的DOM API,所以你可以在元素节点下面有一个Text-node。

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