如何在 Inno Setup 中读取 XML 的标签属性
How to read tag attribute of XML in Inno Setup
这是 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;
我检查了 但无法解决。
不太清楚你想做什么。 bookNode
的 XPath 引用 name
标记,但 book
没有 name
标记,甚至没有 name
属性。
无论如何,假设您想要找出 book
标签的 publisher
属性的 name
属性值,其中 title
(?) 属性等于一个给定的值。
使用 @title
引用 title
属性,而不是引用 non-existing name
标签的文本内容:
//book_info/book[@name=...]
将字符串值换行到 single-quotes(你必须在 Pascal 字符串中将它们加倍):
'//book_info/book[@name=''' + bookName + ''']'
到select publisher
标签的name
属性的值,再次使用@name
语法(name
指的是一个non-existing sub-tag).
publisher[@name]
您可以将两个 XPath 合并为一个,例如:
bookPubName :=
bookXML.SelectSingleNode(
'//book_info/book[@title=''' + bookName + ''']/publisher/@name').text;
这是 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;
我检查了
不太清楚你想做什么。 bookNode
的 XPath 引用 name
标记,但 book
没有 name
标记,甚至没有 name
属性。
无论如何,假设您想要找出 book
标签的 publisher
属性的 name
属性值,其中 title
(?) 属性等于一个给定的值。
使用
@title
引用title
属性,而不是引用 non-existingname
标签的文本内容://book_info/book[@name=...]
将字符串值换行到 single-quotes(你必须在 Pascal 字符串中将它们加倍):
'//book_info/book[@name=''' + bookName + ''']'
到select
publisher
标签的name
属性的值,再次使用@name
语法(name
指的是一个non-existing sub-tag).publisher[@name]
您可以将两个 XPath 合并为一个,例如:
bookPubName :=
bookXML.SelectSingleNode(
'//book_info/book[@title=''' + bookName + ''']/publisher/@name').text;