将节点添加到非默认命名空间会导致重复的限定符

时间:2009-06-30 04:34:50

标签: c# .net xml xmldocument

我正在重写现有的XmlDocument,它包含一个定义了新默认命名空间的元素(参见下面的assemblyBinding元素)

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <legacyCasPolicy enabled="true" />
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    </assemblyBinding>
  </runtime>
</configuration>

我需要能够向这个'assemblyBinding'元素添加新节点,而不需要重新限定命名空间(因为.net运行时在将结果文件视为app.config文件时认为Xml无效)。

这就是我想要的:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <legacyCasPolicy enabled="true" />
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

      <dependentAssembly>
        <assemblyIdentity name="Dependency" publicKeyToken="9f10d5ba1865867c"/>
      </dependentAssembly>

    </assemblyBinding>
  </runtime>
</configuration>

...'dependentAssembly'元素将其父级的名称空间包含在其中。

打电话后 XmlDocument.CreateElement( “dependentAssembly”); 要么 XmlDocument.CreateElement(“dependentAssembly”,“urn:schemas-microsoft-com:asm.v1”); 要么 XmlDocument.CreateElement(“asm”,“dependentAssembly”,“urn:schemas-microsoft-com:asm.v1”);

我不断得到这样的东西......

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <legacyCasPolicy enabled="true" />
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

      <asm:dependentAssembly xmlns:asm="urn:schemas-microsoft-com:asm.v1">
        <asm:assemblyIdentity name="Dependency" publicKeyToken="9f10d5ba1865867c"  xmlns:asm="urn:schemas-microsoft-com:asm.v1"/>
      </asm:dependentAssembly>

    </assemblyBinding>
  </runtime>
</configuration>

我需要做什么才能得到我想要的东西?

3 个答案:

答案 0 :(得分:0)

如果您使用的是.NET 3.5,则可以使用LINQ to XML。例如,此代码:

XNamespace ns = "uri:ns";
XDocument doc = new XDocument
    (new XElement("root",
                  new XElement(ns + "child", new XAttribute("xmlns", ns),
                               new XElement(ns + "grandchild"))));
doc.Save("test.xml");

此XML中的结果:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <child xmlns="uri:ns">
    <grandchild />
  </child>
</root>

我尝试使用XmlDocument获得相同的结果,到目前为止我失败了......

答案 1 :(得分:0)

有和没有asm:前缀的版本是相同的。在这两种情况下,assemblyBindingdependentAssemblyassemblyIdentity元素都位于urn:schemas-microsoft-com:asm.v1命名空间中。

答案 2 :(得分:0)

我尝试在文档中的XPathNavigator上使用AppendChildElement,它似乎不会以这种方式添加多个命名空间声明(该示例不会添加所有必需的元素,但您明白了):

        XmlDocument doc = new XmlDocument();
        doc.LoadXml(
            @"<?xml version='1.0' encoding='utf-8' ?>
                <configuration>
                  <runtime>
                    <legacyCasPolicy enabled='true' />
                    <assemblyBinding xmlns='urn:schemas-microsoft-com:asm.v1'>
                    </assemblyBinding>
                  </runtime>
                </configuration>
             ");       
        NameTable nt = new NameTable();
        XmlNamespaceManager nsm = new XmlNamespaceManager(nt);
        nsm.AddNamespace("x", "urn:schemas-microsoft-com:asm.v1");

        XPathNavigator node = doc.CreateNavigator().SelectSingleNode("//x:assemblyBinding", nsm);
        node.AppendChildElement("", "dependentAssembly", "urn:schemas-microsoft-com:asm.v1", "");

佛瑞德