我正在重写现有的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>
我需要做什么才能得到我想要的东西?
答案 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:前缀的版本是相同的。在这两种情况下,assemblyBinding
,dependentAssembly
和assemblyIdentity
元素都位于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", "");
佛瑞德