C# 通过CreateAttribute(“xmlns”)将名称空间添加到XmlDocument不会';行不通
这是一个错误还是我做错了什么?我在代码中创建了一个C# 通过CreateAttribute(“xmlns”)将名称空间添加到XmlDocument不会';行不通,c#,xml,C#,Xml,这是一个错误还是我做错了什么?我在代码中创建了一个XmlDocument,我使用XmlNamespaceManager向它添加了一个名称空间,然后尝试查询文档。它找不到元素,但是如果Idoc.LoadXml(doc.OuterXml)它会继续查找元素 因此,doc.LoadXml(doc.OuterXml)是一种对我来说毫无意义的黑客行为: a) 为什么没有它我的代码就不能工作? b) 为什么它与它一起工作 var ns = "http://made.up/uri";
XmlDocument
,我使用XmlNamespaceManager
向它添加了一个名称空间,然后尝试查询文档。它找不到元素,但是如果Idoc.LoadXml(doc.OuterXml)
它会继续查找元素
因此,doc.LoadXml(doc.OuterXml)
是一种对我来说毫无意义的黑客行为:
a) 为什么没有它我的代码就不能工作?b) 为什么它与它一起工作
var ns = "http://made.up/uri";
var doc = new XmlDocument();
doc.AppendChild(doc.CreateXmlDeclaration("1.0", "utf-8", null));
var policies = doc.AppendChild(doc.CreateElement("policies"));
var att = policies.Attributes.Append(doc.CreateAttribute("xmlns"));
att.Value = ns;
var policy = policies.AppendChild(doc.CreateElement("policy"));
policy.InnerText="bla";
// doc.LoadXml(doc.OuterXml); // if I uncomment this the SelectNodes() below works
var namespaces = new XmlNamespaceManager(doc.NameTable);
namespaces.AddNamespace("pol", ns);
var policyNodes = doc.SelectNodes("//pol:policy", namespaces);
if (policyNodes.Count == 0){
Console.WriteLine("No policy nodes");
}else{
Console.WriteLine("Found policy nodes");
}
Console.WriteLine(doc.OuterXml + "\n" + DateTime.Now);
Dotnet fiddle在此:
找到了我自己的答案
如果要向XmlDocument添加名称空间,可以将其作为参数添加到CreateElement()
如果您只是使用xmlns=“namespace”
创建一个属性,那么它的作用域与该名称空间中的内容不同(它只是一个属性)
例如:
var policies=doc.AppendChild(doc.CreateElement(“policies”)http://namespace.uri"));代码>
这就是doc.LoadXml(doc.OuterXml)
工作的原因,它实际上将其作为名称空间读取
更新的fiddle考虑改用XDocument。