Wix XUtil xpath使第二个元素不起作用

时间:2016-03-15 15:36:10

标签: xml xpath wix

我想选择第二个MyElement,如果它已经不存在:

 <util:XmlConfig Id="CreateMyElement"
               File="[#MyXml.xml]"
               Action="create"
               ElementPath="/path/to/the/MyElement[2]/next/items"
               VerifyPath="/path/to/the/MyElement[2]/next/items/itemToAdd[\[]@MyAttribute='MyValue'[\]]"
               Name="itemToAdd"
               Node="element"/>

不幸的是,MyElement [2]不起作用。为什么?

3 个答案:

答案 0 :(得分:0)

我认为你的VerifyPath的价值应该在ElementPath中,我也不认为Element[2]会工作,而是使用类似的东西:

/configuration/system.diagnostics/sources/source[\[]@name='Bla.Bla.Services.Mobile.UpdateService'[\]]/listeners/add

答案 1 :(得分:0)

例如parent/MyElement[2]形式的XPath表达式将在每个<MyElement>中每隔一秒<parent>拉出一次:

<parent>
    <MyElement>foo</MyElement>
    <MyElement>bar</MyElement><!-- This one will be returned by XPath -->
</parent>

如果XML文档中的所有<parent>元素只有一个或少于<MyElement>子元素,那么您的XPath将不返回任何内容。如果您只想返回与XPath开头部分匹配的所有<MyElement>中的第二个<MyElement>元素,则需要使用括号,例如:

(/path/to/the/MyElement)[2]/next/items

答案 2 :(得分:0)

WiX中的xpath似乎基于0

在wix .wxs文件中使用以下内容

    <util:XmlFile
      Id="SetLogPath"
      Action="setValue"
      File="[INSTALLFOLDER]Web.config"
      ElementPath="/configuration/log4net/appender[\[]0[\]]/file"
      Name="value"
      Value="[CONFIGDIR]\logs\log.log"/>
    <util:XmlFile
      Id="SetWarningLogPath"
      Action="setValue"
      File="[INSTALLFOLDER]Web.config"
      ElementPath="/configuration/log4net/appender[\[]1[\]]/file"
      Name="value"
      Value="[CONFIGDIR]\logs\warnings.log"/>

更新了以下2个节点。

<?xml version="1.0"?>
<configuration>
  <log4net>
    <appender name="NormalLog" type="log4net.Appender.RollingFileAppender">
      <lockingModel type="log4net.Appender.RollingFileAppender "/>
      <file value="D:\Config\logs\log.log"/>
      <threshold value="DEBUG"/>
      <appendToFile value="true"/>
      <rollingStyle value="Size"/>
      <maxSizeRollBackups value="10"/>
      <maximumFileSize value="10MB"/>
      <staticLogFileName value="true"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%2thread] %-5level %-35.50logger{2} %message%newline"/>
      </layout>
    </appender>
    <appender name="WarningsLog" type="log4net.Appender.RollingFileAppender">
      <lockingModel type="log4net.Appender.RollingFileAppender "/>
      <file value="D:\Config\logs\warnings.log"/>
      <threshold value="WARN"/>
      <appendToFile value="true"/>
      <rollingStyle value="Size"/>
      <maxSizeRollBackups value="10"/>
      <maximumFileSize value="10MB"/>
      <staticLogFileName value="true"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%2thread] %-5level %-35.50logger{2} %message%newline"/>
      </layout>
    </appender>

我尝试首先使用基于1的索引,但是第二个节点已使用log.log更新,然后安装程序无法尝试更新找不到的节点。