【发布时间】:2015-09-21 08:31:13
【问题描述】:
我有一个 XML 文件:
<ns2:root xmlns:ns2="namespace">
<ns2:a>
<ns2:b>some content</b>
<ns2:c>some content</c>
<ns2:d>some content</d>
</a>
</root>
我需要在特定的地方添加一个新节点,我的代码是:
var doc = XDocument.Load(file);
XNamespace ns2 = "namespace";
doc.Element(ns2 + "root").Element(ns2 + "a").Element(ns2 + "c").AddAfterSelf(
new XElement(ns2+"new",
new XElement("new1",
new XElement("new2","some content"),
new XElement("new3", "some content"))));
输出是:
<ns2:root xmlns:ns2="namespace">
<ns2:a>
<ns2:b>some content</b>
<ns2:c>some content</c>
<ns2:new>
<new1 xmlns="">
<new2>some content</new2>
<new3>some content</new3>
</new1>
</new>
<ns2:d>some content</d>
</a>
</root>
期望的输出是:
<ns2:root xmlns:ns2="namespace">
<ns2:a>
<ns2:b>some content</b>
<ns2:c>some content</c>
<ns2:new>
<new1>
<new2>some content</new2>
<new3>some content</new3>
</new1>
</new>
<ns2:d>some content</d>
</a>
</root>
如何避免将 xmlns 属性添加到节点 new1?
在所需输出中编辑错误。
【问题讨论】:
-
从信息的角度来看,它们是相同的。通常,您不应该关心 XML 工具如何选择表示信息,除非您将此 XML 输入到实际上不能与 XML 一起使用的东西中,否则这不应该是一个问题——如果它与“完整的字符串”一起使用如果尖括号看起来像 XML”,但需要绝对格式,那么通常最好推动更改损坏的组件,而不是尝试在 XML 中强制使用特定的表示形式。
-
您的示例 XML 无效,更正后我无法重现您声称的行为。我强烈怀疑在您的 XML 中的某处实际上有一个
xmlns="...",这会显着改变事情。此外,您想要的输出与您当前的输出非常不同 - 它包含带有文本的new1和new2元素,而不是包含带有文本的new2和new3的new1。请展示一个简短但完整的示例来说明问题,并使您的问题自洽。 -
同样的事情发生在我身上。我的代码是- var target = doc.Descendants().Where(p => p.Name.LocalName == "Flight" && p.Value == flightNum).Single(); target.Value = flightNumWithoutSuffix; //更新元素值 target.AddAfterSelf("Suffix", suffix);它正在向 Xdocument 添加一个元素作为
suffix 我的期望是它应该是suffix
标签: c# linq-to-xml xml-namespaces