如何在Inno Setup中读取XML的tag属性

时间:2018-03-11 14:44:40

标签: xml xpath inno-setup pascalscript

这是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但无法解决。

1 个答案:

答案 0 :(得分:1)

你想做什么并不是很清楚。您的bookNode XPath指的是name标记,但book没有name标记,甚至没有name属性。

无论如何,我们假设您要查找name的{​​{1}}个publisher属性的值booktitle(?)属性等于给定值。

  • 使用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;