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

米特拉

这是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标记,但无法解析。

马丁·普里克里(Martin Prikryl)

目前尚不清楚您想做什么。您的XPath forbookNode引用了一个name标签,但是book没有name标签,甚至没有name属性。


无论如何,让我们假设您要找出具有(?)属性namepublishertag的tag属性的值等于给定值。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;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章