Как установить атрибут xmlns при использовании XMLFile в Wix 3 - PullRequest
4 голосов
/ 27 августа 2009

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

<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).

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

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

Итак, мой фиксированный код выглядит так:

<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 ]

2 голосов
/ 14 апреля 2012

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

<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 голос
/ 27 августа 2009

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

...