如何使用 linq xml 将命名空间添加到 xml

Posted

技术标签:

【中文标题】如何使用 linq xml 将命名空间添加到 xml【英文标题】:How to add namespace to xml using linq xml 【发布时间】:2016-12-14 06:24:09 【问题描述】:

问题更新:如果我的问题不清楚,我很抱歉

这是我现在使用的代码

XDocument doc = XDocument.Parse(framedoc.ToString());
foreach (var node in doc.Descendants("document").ToList())

    XNamespace ns = "xsi";
    node.SetAttributeValue(ns + "schema", "");
    node.Name = "alto";

这是输出

<alto p1:schema="" xmlns:p1="xsi">

我的目标是这样的

xsi:schemaLocation=""

p1xmlns:p1="xsi" 是从哪里来的?

【问题讨论】:

XElement namespaces (How to?)的可能重复 @CSharpie 请查看更新后的问题,为什么它给我错误的输出?谢谢 输出的哪一点是“错误的”?请在问题中突出显示它,理想情况下将输出分成多行以使其更易于阅读。 (如果您可以简化它以减少正确的位数,那也会有所帮助。) 当您想要的输出中没有任何地方包含“sphinx”时,不清楚为什么您的代码包含“sphinx”... @JonSkeet 我更新了问题先生。输出是 p2:schemaLocation="" 而不是 xsi:schemaLocation="",关于“狮身人面像”对不起。我更新了它。 【参考方案1】:

当你写作时

XNamespace ns = "xsi";

这将创建一个 URI 仅为“xsi”的XNamespace。那不是你想要的。您需要 xsi... 的命名空间 alias,并通过 xmlns 属性使用适当的 URI。所以你想要:

XDocument doc = XDocument.Parse(framedoc.ToString());
foreach (var node in doc.Descendants("document").ToList())

    XNamespace ns = "http://www.w3.org/2001/XMLSchema-instance";
    node.SetAttributeValue(XNamespace.Xmnls + "xsi", ns.NamespaceName);
    node.SetAttributeValue(ns + "schema", "");
    node.Name = "alto";

或者更好,只需在根元素处设置别名:

XDocument doc = XDocument.Parse(framedoc.ToString());
XNamespace ns = "http://www.w3.org/2001/XMLSchema-instance";
doc.Root.SetAttributeValue(XNamespace.Xmlns + "xsi", ns.NamespaceName);
foreach (var node in doc.Descendants("document").ToList())

    node.SetAttributeValue(ns + "schema", "");
    node.Name = "alto";

创建文档示例:

using System;
using System.Xml.Linq;

public class Test

    static void Main()
    
        XNamespace ns = "http://www.w3.org/2001/XMLSchema-instance";
        XDocument doc = new XDocument(
            new XElement("root",
                new XAttribute(XNamespace.Xmlns + "xsi", ns.NamespaceName),
                new XElement("element1", new XAttribute(ns + "schema", "s1")),
                new XElement("element2", new XAttribute(ns + "schema", "s2"))
            )                         
        );
        Console.WriteLine(doc);
    

输出:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <element1 xsi:schema="s1" />
  <element2 xsi:schema="s2" />
</root>

【讨论】:

以上是关于如何使用 linq xml 将命名空间添加到 xml的主要内容,如果未能解决你的问题,请参考以下文章

Linq to XML - 使用命名空间获取元素

LINQ to XML - 如何修复根元素中的默认命名空间

如何使用Xpath检索XML文件中的命名空间

使用带有 Xml 命名空间的 Linq to Xml

为啥 XNode 在 System.XML.Linq 命名空间而不是 System.XML?

使用 jaxb 将命名空间添加到 xml 的根元素