这是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;
我检查了如何在Inno Setup中基于其子标记的值选择XML标记,但无法解析。
目前尚不清楚您想做什么。您的XPath forbookNode
引用了一个name
标签,但是book
没有name
标签,甚至没有name
属性。
无论如何,让我们假设您要找出具有(?)属性name
的publisher
tag的tag属性的值等于给定值。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;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句