有人能帮我从<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;
最简单的方法是使用IXMLDOMDocument
和XPath
;
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;