Как получить доступ к значениям дочерних узлов в моем документе XML? - PullRequest
0 голосов
/ 02 апреля 2012

У меня есть 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 экземпляров «Элемента», так что это проверяет, nodeName = AccountName, что я и ожидаю. Но nodeValue пусто. Есть ли другой способ вытащить значения? Кто-нибудь знает, почему значения узлов пустые?

Ответы [ 2 ]

3 голосов
/ 02 апреля 2012

Вы опускаетесь до уровня 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;   
2 голосов
/ 02 апреля 2012

Предположение: похоже на стандартный DOM API, поэтому вы можете иметь Text-узел ниже узлов элемента.

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