Как установить атрибут xmlns при использовании XMLFile в Wix 3


Я добавляю элементы в XML-файл во время установки с помощью элемента XmlFile:

<util:XmlFile Id="SetOracleDialectProperty"
              Action="createElement"
              ElementPath="//hibernate-configuration/session-factory"
              Name="property"
              Sequence="9"
              File="[INSTALLLOCATION]Confighibernate.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, указанный в корневом узле файла, поэтому элемент property неправильно распознается nhibernate.

Как я могу либо установить значение, соответствующее корневому узлу, либо удалить атрибут xmlns?

Я потратил некоторое время на поиск ответа, и ближе всего я нашел "do what you would do in MSXML", который не помогает мне, поскольку он не говорит, как это сделать в WiX (например, какой атрибут в XmlFile использовать).

EDIT Чтобы немного объяснить ответ Роба, в месте, где я могу использовать хорошее форматирование:

  • вы добавляете фрагмент документа, задав Node= "document" в элементе XmlConfig.
  • необходимо явно задать пространство имен в противном случае вы снова получаете значение по умолчанию.
  • Кроме того, хотя вы добавляете "документ", он, кажется, не работает, если вы указываете более одного элемента. Вы получаете таинственную и совершенно бесполезную ошибку времени выполнения "мастер установки закончился преждевременно".

Итак, мой фиксированный код выглядит следующим образом:

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

2 ответа:

Проблема здесь заключается в том, что MSXML утверждает, что createElement всегда будет давать вам пространство имен по умолчанию (так же, как вы видите). Я думаю, что вам нужно будет переключиться на более сложный, но более мощный XmlConfig. В этом случае попробуйте использовать фрагмент документа, чтобы добавить весь элемент с правильным пространством имен, а не зависеть от MSXML, чтобы создать его для вас.

Я знаю, что это спустя годы, но если кто-то еще столкнется с этим, я думаю, что истинное решение таково:

<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" - когда config будет записан, он будет выглядеть так же, как он распознает, что это пространство имен по умолчанию. У меня была та же проблема с настройкой файлов манифеста, и этот подход ее разобрал.