通过CreateAttribute(“xmlns”)将NameSpace添加到XmlDocument不起作用

时间:2014-05-31 04:32:32

标签: c# xml

这是一个错误还是我做错了什么?我在代码中创建了一个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

1 个答案:

答案 0 :(得分:1)

找到我自己的答案。

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

来实现。

如果你只是使用xmlns="namespace"创建一个属性,它就不会像在该命名空间中那样对任何内容进行定位(它只是一个属性。)

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

这就是为什么doc.LoadXml(doc.OuterXml)有效,实际将其作为命名空间读取

更新了小提琴https://dotnetfiddle.net/sNdH6R