1

我正在重写一个现有的 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>

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

4

3 回答 3

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", "");

弗雷德

于 2009-11-06T00:41:43.397 回答
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,但到目前为止我失败了......

于 2009-06-30T06:07:49.833 回答
0

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

于 2009-09-13T07:31:05.580 回答