在Wix 3中使用XMLFile时,如何设置xmlns属性

时间:2009-08-26 21:34:40

标签: wix wix3

我在安装期间使用XmlFile元素向XML文件添加元素:

<util:XmlFile Id="SetOracleDialectProperty"
              Action="createElement"
              ElementPath="//hibernate-configuration/session-factory"
              Name="property"
              Sequence="9"
              File="[INSTALLLOCATION]Config\hibernate.config"
              Value="NHibernate.Dialect.Oracle10gDialect"/>

我写的空文件如下所示:

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
  </session-factory>
</hibernate-configuration>

运行安装程序后,我最终得到了这个:

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <property xmlns="">NHibernate.Dialect.Oracle10gDialect</property>
  </session-factory>
</hibernate-configuration>

问题是空的xmlns属性覆盖了文件根节点中指定的xmlns,因此nhibernate无法正确识别属性元素。

如何设置值以匹配根节点或删除xmlns属性?

我花了一些时间寻找答案,而我发现的最接近的是“做你在MSXML中做的事情”这对我没有帮助,因为它没有说明如何在WiX中做到这一点(例如什么要使用的XmlFile属性。

修改 在稍微解释Rob的答案的地方,我可以使用很好的格式:

  • 您可以通过在XmlConfig元素上设置Node =“document”来添加文档片段。
  • 您必须明确设置命名空间,否则您将再次获得默认命名空间。
  • 此外,虽然您要添加“文档”,但如果指定多个元素,它似乎不起作用。你得到一个神秘而彻底无益的“安装向导过早结束”运行时错误。

所以我的固定代码如下所示:

<util:XmlConfig Id="MsSqlDialect"
                Action="create"
                ElementPath="//hibernate-configuration/session-factory"
                File="[INSTALLLOCATION]Config\hibernate.config"
                Node="document">
  <![CDATA[
    <property xmlns="urn:nhibernate-configuration-2.2" name="dialect">NHibernate.Dialect.Oracle10gDialect</property>
  ]]>
</util:XmlConfig>

2 个答案:

答案 0 :(得分:2)

我知道这是多年之后但是如果有其他人遇到这个我认为真正的解决方案就是这样:

<util:XmlFile Id="SetOracleDialectProperty"
              Action="createElement"
              ElementPath="//hibernate-configuration/session-factory"
              Name="urn:nhibernate-configuration-2.2:property"
              Sequence="9"
              File="[INSTALLLOCATION]Config\hibernate.config"
              Value="NHibernate.Dialect.Oracle10gDialect"/>

更改从Name="property"更改为Name="urn:nhibernate-configuration-2.2:property" - 当编写配置时,它会显示为正确,因为它会识别它是默认命名空间。调整清单文件时遇到了同样的问题,这种方法对它进行了排序。

答案 1 :(得分:1)

这里的问题是MSXML声明createElement将始终为您提供默认命名空间(就像您所看到的那样)。我认为你需要切换到更复杂但功能更强大的XmlConfig。在这种情况下,尝试使用文档片段添加具有正确名称空间的整个元素,而不是依赖于MSXML为您创建它。