Ber*_*tAR 4 c# xml xelement linq-to-xml
XML
源 XML
<!-- The comment -->
<Root xmlns="http://www.namespace.com">
<FirstElement>
</FirstElement>
<SecondElement>
</SecondElement>
</Root>
Run Code Online (Sandbox Code Playgroud)
所需的 XML
<!-- The comment -->
<Root xmlns="http://www.namespace.com">
<FirstElement>
</FirstElement>
<SecondElement>
</SecondElement>
<ThirdElement>
<FourthElement>thevalue</FourthElement>
</ThirdElement>
</Root>
Run Code Online (Sandbox Code Playgroud)
现在我的输出 XML 是
<!-- The comment -->
<Root xmlns="http://www.namespace.com">
<FirstElement>
</FirstElement>
<SecondElement>
</SecondElement><ThirdElement><FourthElement>thevalue</FourthElement></ThirdElement>
</Root>
Run Code Online (Sandbox Code Playgroud)
请注意,我需要加载 XML,LoadOptions.PreserveWhitespace因为我需要保留所有空格(客户需要)。所需的输出是在“根”的最后一个子元素之后放置 2 个换行符,并添加适当的缩进
<ThirdElement>
<FourthElement>thevalue</FourthElement>
</ThirdElement>
Run Code Online (Sandbox Code Playgroud)
任何想法如何实现这一点?
代码
var xDoc = XDocument.Load(sourceXml, LoadOptions.PreserveWhitespace); //need to preserve all whitespaces
var mgr = new XmlNamespaceManager(new NameTable());
var ns = xDoc.Root.GetDefaultNamespace();
mgr.AddNamespace("ns", ns.NamespaceName);
if (xDoc.Root.HasElements)
{
xDoc.Root.Elements().Last().AddAfterSelf(new XElement(ns + "ThirdElement", new XElement(ns + "FourthElement", "thevalue")));
using (var xw = XmlWriter.Create(outputXml, new XmlWriterSettings() { OmitXmlDeclaration = true })) //omit xml declaration
xDoc.Save(xw);
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,您应该向您的客户解释这真的不重要。
但是,如果您真的需要弄乱空格,我会注意到这XText就是您所需要的。这是另一个XObject代表文本节点并且可以作为内容的一部分穿插的。这可能是比字符串操作更好的方法。
例如:
doc.Root.Add(
new XText("\n\t"),
new XElement(ns + "ThirdElement",
new XText("\n\t\t"),
new XElement(ns + "FourthElement", "thevalue"),
new XText("\n\t")),
new XText("\n"));
Run Code Online (Sandbox Code Playgroud)
请参阅此演示。