【发布时间】:2018-07-30 20:47:20
【问题描述】:
XML
源 XML
<!-- The comment -->
<Root xmlns="http://www.namespace.com">
<FirstElement>
</FirstElement>
<SecondElement>
</SecondElement>
</Root>
所需的 XML
<!-- The comment -->
<Root xmlns="http://www.namespace.com">
<FirstElement>
</FirstElement>
<SecondElement>
</SecondElement>
<ThirdElement>
<FourthElement>thevalue</FourthElement>
</ThirdElement>
</Root>
现在我的输出 XML 是
<!-- The comment -->
<Root xmlns="http://www.namespace.com">
<FirstElement>
</FirstElement>
<SecondElement>
</SecondElement><ThirdElement><FourthElement>thevalue</FourthElement></ThirdElement>
</Root>
请注意,我需要使用 LoadOptions.PreserveWhitespace 加载 XML,因为我需要保留所有空格(客户需要)。
所需的输出是在“根”的最后一个子元素之后放置 2 个换行符并添加适当的缩进
<ThirdElement>
<FourthElement>thevalue</FourthElement>
</ThirdElement>
任何想法如何实现这一点?
代码
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);
}
【问题讨论】:
-
你为什么关心空白?除了增加您存储的数据量之外,它什么也不做。
-
@DavidG 这是客户想要的
-
您可能无法使用额外的换行符做任何事情,但
Indent设置可能会使它看起来稍微好一些。 -
您可以将 cmets 添加到文件中,而不是额外的空白行,您可以在其中添加 cmets 指示子项的结束。我通常会在我的 xml 文件的每个部分添加开始注释和结束注释,以便于人类阅读。
标签: c# xml linq-to-xml xelement