【问题标题】:.NET XmlDocument: How to create element with no prefix, but namespace with prefix?.NET XmlDocument:如何创建没有前缀但有前缀的命名空间的元素?
【发布时间】:2015-06-15 03:04:47
【问题描述】:

我正在使用 .NET 的 XmlDocument 类,因为我需要动态编辑 XML 文档。

我正在尝试创建一个如下所示的元素:

<element xmlns:abc="MyNamespace">

这是我目前编写的代码:

XmlDocument xml = new XmlDocument();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xml.NameTable);
nsmgr.AddNamespace("abc", "MyNamespace");

XmlNode declarationNode = xml.CreateXmlDeclaration("1.0", "UTF-8", null);
xml.AppendChild(declarationNode);

// Create a root element with a default namespace.
XmlNode rootNode = xml.CreateElement("root", "rootNamespace");
xml.AppendChild(rootNode);

XmlNode containerNode = xml.CreateElement("container", xml.DocumentElement.NamespaceURI);
rootNode.AppendChild(containerNode);

// Create the element node in question:
XmlNode elementNode = xml.CreateElement("element", xml.DocumentElement.NamespaceURI);

XmlAttribute attr = xml.CreateAttribute("abc", "def", nsmgr.LookupNamespace("abc"));

elementNode.Attributes.Append(attr);

containerNode.AppendChild(elementNode);

这是我的输出:

<?xml version="1.0" encoding="UTF-8"?>
<rootNode xmlns="MyNamespace">
  <container>
    <element abc:def="" xmlns:abc="MyNamespace" />
  </container>
</rootNode>

似乎 attribute attr 导致 "abc:def=""" 和 "xmlns:abc="MyNamespace"" 都被设置——我想要的只是后者?

【问题讨论】:

    标签: .net xml xmldocument


    【解决方案1】:

    你应该在顶层声明你的命名空间。

    查看这篇文章以获取示例: How do I add multiple namespaces to the root element with XmlDocument?

    【讨论】:

    • 感谢您的链接——但我认为我的部分问题是有问题的属性是“xmlns”,这意味着一个命名空间,而不仅仅是我们可以定义的任何属性。
    • 如果您在文档的顶层声明命名空间并带有前缀,则命名空间将不会在 XML 的每个节点上输出。 此输出不需要命名空间规范,因为它已在您的 xml 的顶层声明
    • 如果 是你的根元素,那么你只能拥有这个......但如果你的完整 XML 像 您必须在元素上指定命名空间,并且不会在每个 abc 上重复;元素 :=)
    • 感谢@Laurent Lequenne 的帮助。我更新了我的源代码,因为它的行为似乎仍然不像我预期的那样。设置属性会导致添加两个命名空间装饰?
    【解决方案2】:

    这是在这里工作

        XmlDocument xml = new XmlDocument();
        XmlNamespaceManager nsmgr = new XmlNamespaceManager(xml.NameTable);
        nsmgr.AddNamespace("abc", "MyNamespace");
    
        XmlNode declarationNode = xml.CreateXmlDeclaration("1.0", "UTF-8", null);
        xml.AppendChild(declarationNode);
    
        // Create a root element with a default namespace.
        XmlElement rootNode = xml.CreateElement("root");
        rootNode.SetAttribute("xmlns:abc", "MyNamespace");
    
        xml.AppendChild(rootNode);
    
        XmlNode containerNode = xml.CreateElement("container", xml.DocumentElement.NamespaceURI);
        rootNode.AppendChild(containerNode);
    
        // Create the element node in question:
        XmlNode elementNode = xml.CreateElement("abc", "element", "MyNamespace");
    
        containerNode.AppendChild(elementNode);
    
        Console.Write(rootNode.OuterXml); 
    

    输出是

     <root xmlns:abc="MyNamespace"><container><abc:element /></container></root>
    

    【讨论】:

    • 感谢您的帮助,@Laurent Lequenne。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多