【发布时间】: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#