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