2009-08-26 3 views
4

Ich Hinzufügen von Elementen zu einer XML-Datei während der Installation XMLFILE Element mit:Wie richte ich das xmlns-Attribut, wenn XMLFile in Wix mit 3

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

Die leere Datei, die ich wie folgt aussieht schreibe:

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

Nach dem Ausführen des Installers ich mit diesem Ende:

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

Das Problem ist, dass die leere Das xmlns-Attribut überschreibt die im Stammknoten der Datei angegebenen xmlns, sodass das Eigenschaftenelement von nhibernate nicht korrekt erkannt wird.

Wie kann ich den Wert entweder auf den Stammknoten einstellen oder das Attribut xmlns entfernen?

Ich habe einige Zeit damit verbracht, nach einer Antwort zu suchen und die nächste, die ich gefunden habe, ist "tu, was du in MSXML machen würdest", was mir nicht hilft, wie es in WiX zu machen ist (z welches Attribut auf XmlFile zu verwenden ist).

EDIT Um Robs Antwort leicht, an einem Ort zu erklären, wo ich schöne Formatierung verwenden:

  • Sie fügen ein Dokumentfragment von Node = „Dokument“ auf dem XMLConfig Elemente festlegen.
  • Sie müssen den Namespace explizit festlegen, sonst erhalten Sie wieder den Standardnamen.
  • Auch wenn Sie ein "Dokument" hinzufügen, scheint es nicht zu funktionieren, wenn Sie mehr als ein Element angeben. Sie erhalten einen mysteriösen und sehr wenig hilfreichen "Setup Wizard vorzeitig beendet" Laufzeitfehler.

So sieht mein festen Code wie folgt aus:

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

Antwort

1

Das Problem hierbei ist, dass MSXML besagt, dass create geben Ihnen immer die Standard-Namespace (wie Sie sehen). Ich denke, dass Sie zu der komplexeren, aber leistungsfähigeren XmlConfig wechseln müssen. Versuchen Sie in diesem Fall, ein Dokumentfragment zu verwenden, um das gesamte Element mit dem richtigen Namespace hinzuzufügen, anstatt von MSXML abhängig zu sein, um es für Sie zu erstellen.

2

Ich weiß, das Jahre später, aber wenn jemand anderes über das kommt denke ich, die wahre Lösung ist folgendes:

<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"/> 

Änderung ist von Name="property" zu Name="urn:nhibernate-configuration-2.2:property" - wenn Config geschrieben wird es als genauso wie es apprear wird erkennt, dass es der Standardnamespace ist. Ich hatte das selbe Problem, Manifest-Dateien anzupassen und dieser Ansatz sortierte es.