这是一个错误还是我做错了什么?我在代码中创建了一个XmlDocument
,我用XmlNamespaceManager
为它添加了一个命名空间,然后尝试查询该文档。它无法找到该元素,但是如果我doc.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小提琴: https://dotnetfiddle.net/DQGwH2
答案 0 :(得分:1)
找到我自己的答案。
如果要将名称空间添加到XmlDocument,可以通过将其作为参数添加到CreateElement()
如果你只是使用xmlns="namespace"
创建一个属性,它就不会像在该命名空间中那样对任何内容进行定位(它只是一个属性。)
如:
var policies = doc.AppendChild(doc.CreateElement("policies","http://namespace.uri"));
这就是为什么doc.LoadXml(doc.OuterXml)
有效,实际将其作为命名空间读取