这是XML文件:
<book_info>
<book title = "Peter Pan">
<publisher name="Penguin" edition="2nd" date ="2/6/2016" />
<Page size= "207" />
<author name = "J M Barrie"/>
<info genre = "novel" lang = "English"/>
</book>
<book title = "Room of Many Color">
<publisher name="Penguin" edition="1st" date ="3/11/2000" />
<Page size= "387" />
<author name = "Ruskin Bond"/>
<info genre = "sort stories" lang = "English"/>
</book>
</book_info>
以下是我尝试访问发布商名称的方法:
bookXML := CreateOleObject('Msxml2.DOMDocument.6.0');
bookXML.async := False;
bookXML.load(ExpandConstant('{tmp}\book.xml'));
bookNode := bookXML.SelectSingleNode('//book_info/book[name/text()=' + bookName + ']');
bookPubName := bookNode.SelectSingleNode('publisher[name]').text;
但它始终为最后一行提供NIL接口异常。
bookPubName := bookNode.SelectSingleNode('publisher[name]').text;
我查了How to select XML tag based on value of its child tag in Inno Setup但无法解决。
答案 0 :(得分:1)
你想做什么并不是很清楚。您的bookNode
XPath指的是name
标记,但book
没有name
标记,甚至没有name
属性。
无论如何,我们假设您要查找name
的{{1}}个publisher
属性的值book
,title
(?)属性等于给定值。
使用title
参考@title
属性,而不是引用不存在的name
标记的文字内容:
//book_info/book[@name=...]
将字符串值换行为单引号(您必须在Pascal字符串中将它们加倍):
'//book_info/book[@name=''' + bookName + ''']'
要选择name
标记publisher
属性的值,请再次使用@name
语法(name
表示不存在的子标记)。
publisher[@name]
您可以将两个XPath合并为:
bookPubName :=
bookXML.SelectSingleNode(
'//book_info/book[@title=''' + bookName + ''']/publisher/@name').text;