【问题标题】:Specify namespace for new XElement为新 XElement 指定命名空间
【发布时间】:2021-06-08 23:01:21
【问题描述】:

我正在尝试将新元素添加到现有 XDocument,其中新 XElement 指定命名空间或者是默认命名空间的一部分。

我已经有一个 XmlNamespaceManager,我可以使用它来选择元素。

XmlNamespaceManager nsMgr = new XmlNamespaceManager(new NameTable());
nsMgr.AddNamespace("default", "http://www.mismo.org/residential/2009/schemas");
nsMgr.AddNamespace("customNs", "http://custom.org");

考虑以下 XML

<ROOT xmlns="http://www.mismo.org/residential/2009/schemas" xmlns:customNs="http://custom.org">
    <ELM_1>
        <ELM_1_SUB_1>Some value</ELM_1_SUB_1>
    </ELM_1>
    <customNs:ELM_2>
        <customNs:ELM_2_SUB_1>Another value</customNs:ELM_2_SUB_1>
    </customNs:ELM_2>
</ROOT>

我想写一些代码来实现:

<ROOT xmlns="http://www.mismo.org/residential/2009/schemas" xmlns:customNs="http://custom.org">
    <ELM_1>
        <ELM_1_SUB_1>Some value</ELM_1_SUB_1>
        <ELM_1_SUB_2>ADDED TO DEFAULT NAMESPACE</ELM_1_SUB_2>
    </ELM_1>
    <customNs:ELM_2>
        <customNs:ELM_2_SUB_1>Another value</customNs:ELM_2_SUB_1>
        <customNs:ELM_2_SUB_2>ADDED TO CUSTOM NAMESPACE</customNs:ELM_2_SUB_2>
    </customNs:ELM_2>
</ROOT>

我尝试了以下方法:

var elm1 = xDoc.XPathSelectElement("/default:ROOT/default:ELM_1", nsMgr);
elm1.Add(new XElement("default:ELM_1_SUB_2", "ADDED TO DEFAULT NAMESPACE"));

var elm2 = xDoc.XPathSelectElement("/default:ROOT/customNs:ELM_2", nsMgr);
elm2.Add(new XElement("customNs:ELM_2_SUB_2", "ADDED TO CUSTOM NAMESPACE"));

上面的代码确实选择了我想要添加的元素,但 Add 会引发 XmlException:The ':' character, hexadecimal value 0x3A, cannot be included in a name.

当我尝试不使用元素名称中提供的命名空间时,我没有收到错误,但它并没有达到我想要的效果。

所以这个:

var elm1 = xDoc.XPathSelectElement("/default:ROOT/default:ELM_1", nsMgr);
elm1.Add(new XElement("ELM_1_SUB_2", "ADDED TO DEFAULT NAMESPACE"));

结果如下:

<ROOT xmlns="http://www.mismo.org/residential/2009/schemas" xmlns:customNs="http://custom.org">
    <ELM_1>
        <ELM_1_SUB_1>Some value</ELM_1_SUB_1>
        <ELM_1_SUB_2 xmlns="">ADDED TO DEFAULT NAMESPACE</ELM_1_SUB_2>
    </ELM_1>
    <customNs:ELM_2>
        <customNs:ELM_2_SUB_1>Another value</customNs:ELM_2_SUB_1>
    </customNs:ELM_2>
</ROOT>

我缺少什么来创建所需的 XML 输出?

【问题讨论】:

    标签: c#


    【解决方案1】:

    使用所需的值创建 XNamespace 类型。
    在创建 XElement 时使用它们。

    XNamespace defaultNs = "http://www.mismo.org/residential/2009/schemas";
    XNamespace customNs = "http://custom.org";
    
    elm1.Add(new XElement(defaultNs + "ELM_1_SUB_2", "ADDED TO DEFAULT NAMESPACE"));
    
    elm2.Add(new XElement(customNs + "ELM_2_SUB_2", "ADDED TO CUSTOM NAMESPACE"));
    

    【讨论】:

    • XNamespace 设置为字符串并与字符串连接让我有点失望,但它确实有效。谢谢。
    猜你喜欢
    • 2014-12-31
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多