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
向它添加了一个名称空间,然后尝试查询文档。它找不到元素,但是如果I
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 fiddle在此: 找到了我自己的答案

如果要向XmlDocument添加名称空间,可以将其作为参数添加到
CreateElement()

如果您只是使用
xmlns=“namespace”
创建一个属性,那么它的作用域与该名称空间中的内容不同(它只是一个属性)

例如:
var policies=doc.AppendChild(doc.CreateElement(“policies”)http://namespace.uri"));

这就是
doc.LoadXml(doc.OuterXml)
工作的原因,它实际上将其作为名称空间读取


更新的fiddle

考虑改用XDocument。