如何在 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;