正在从XML节点中提取未知值



有人能帮我从<a n="Formatted Name" v="Test Project 1"/> 中的每个项目中获取"测试项目n"字符串值吗

这些似乎不是属性。它们是什么?我如何获得我需要的文本?

<?xml version="1.0" encoding="utf-8" ?>
<items>
<item Id="814135481" Rank="1"><a n="Formatted Name" v="Test Project 1"/></item>
<item Id="814135882" Rank="2"><a n="Formatted Name" v="Test Project 2"/></item>
<item Id="814135908" Rank="3"><a n="Formatted Name" v="Test Project 3"/></item>
</items>
 RootNode := XMLDoc.DocumentElement;
  for I := 0 to RootNode.ChildNodes.Count-1 do
  begin
   //
  end;

RootNode.ChildNodes[I].AttributeNodes[n]

会给我项目的属性列表,但我不知道如何提取这些值

<a n="Formatted Name" v="Test Project 1"/>

XML用于理解答案:

<?xml version="1.0" encoding="utf-8" ?>
    <items>
      <item Id="814135481" Rank="1">
        <a n="Formatted Name" v="Test Project 1"/>
    </item>
      <item Id="814135882" Rank="2">
        <a n="Formatted Name" v="Test Project 2"/>
    </item>
      <item Id="814135908" Rank="3">
        <a n="Formatted Name" v="Test Project 3"/>
    </item>
    </items>

它们是a标记上的属性,但a标记是item标记的子标记,后者是items标记的子对象。您的for循环只会给您一个结果,即items节点。

您可以使用嵌套循环来处理此问题,也可以使用xpath查询来获取与items/item/a匹配的所有标记的集合。然后你看看上面的属性。

事实证明这比我想象的要容易。我读错了XML:

RootNode.ChildNodes[I].子节点[0].AttributeNodes[1].Text;

最简单的方法是使用IXMLDOMDocumentXPath

uses
  msxml;
const
  TestXML = '<?xml version="1.0" encoding="utf-8" ?>' +
            '<items><item Id="814135481" Rank="1">' +
            '<a n="Formatted Name" v="Test Project 1"/></item>' +
            '<item Id="814135882" Rank="2">' + 
            '<a n="Formatted Name" v="Test Project 2"/>' + '</item>' +
            '<item Id="814135908" Rank="3">' + 
            '<a n="Formatted Name" v="Test Project 3"/>' + 
            '</item></items>';
var
  Doc: IXMLDOMDocument;
  NodeList: IXMLDOMNodeList;
  ANode: IXMLDOMNode;
  i: Integer;
begin
  Doc := CoDOMDocument.Create;
  Doc.loadXML(TestXML);
  // Select all of the <a> nodes only 
  NodeList := Doc.selectNodes('//a');
  // Error checking omitted. Should test for `NodeList <> nil` before use here.
  for i := 0 to NodeList.length - 1 do
    // Should really use another node here as an intermediate
    //  step, to make sure that getNamedItem succeeded. Omitted
    //  for brevity 
    Memo1.Lines.Add(Node.attributes.getNamedItem('v').nodeValue);
end;

最新更新