我正在使用 XDocument
编写 XML 文件。我想调整文件布局。让我解释一下,这里是生成文件的摘录:
<ROOTELEMENT>
<CHILDELEMENT>
<INFO1>Test a 1</INFO1>
<INFO2>Test a 2</INFO2>
</CHILDELEMENT>
<CHILDELEMENT>
<INFO1>Test b 1</INFO1>
<INFO2>Test b 2</INFO2>
</CHILDELEMENT>
<ROOTELEMENT>
我希望我的文件看起来像这样:
<ROOTELEMENT>
<CHILDELEMENT><INFO1>Test a 1</INFO1><INFO2>Test a 2</INFO2></CHILDELEMENT>
<CHILDELEMENT><INFO1>Test b 1</INFO1><INFO2>Test b 2</INFO2></CHILDELEMENT>
</ROOTELEMENT>
这是我的代码:
var myDoc = new XDocument(new XElement("ROOTELEMENT",
new XElement("CHILDELEMENT",
new XElement("INFO1", "Test a 1"),
new XElement("INFO2", "Test a 2")),
new XElement("CHILDELEMENT",
new XElement("INFO1", "Test b 1"),
new XElement("INFO2", "Test b 2"))));
myDoc.Save("Test.xml");
最佳答案
XML 输出的格式由 XmlWriter
控制不是 XElement
或 XDocument
,因此,如果您需要精确控制格式,则需要通过子类化 XmlWriter
的实现之一来创建自己的编写器,具体来说XmlTextWriter
谁的Formatting
属性是可变的,可以在写入期间更改。
例如,这是一个当元素深度超过 1 时禁用缩进的版本:
public class CustomFormattingXmlTextWriter : XmlTextWriter
{
readonly Stack<Formatting> stack = new Stack<Formatting>();
public CustomFormattingXmlTextWriter(TextWriter writer, int indentDepth) : base(writer)
{
this.Formatting = Formatting.Indented;
this.IndentDepth = indentDepth;
}
int IndentDepth { get; }
void OnElementStarted(string localName, string ns)
{
stack.Push(Formatting);
// You could e.g. modify the logic here to check to see whether localName == CHILDELEMENT
// if (localName == "CHILDELEMENT")
if (stack.Count == IndentDepth+1)
Formatting = Formatting.None;
}
void OnElementEnded()
{
var old = stack.Pop();
if (old != Formatting)
Formatting = old;
}
public override void WriteStartElement(string prefix, string localName, string ns)
{
base.WriteStartElement(prefix, localName, ns);
OnElementStarted(localName, ns);
}
public override void WriteEndElement()
{
base.WriteEndElement();
OnElementEnded();
}
public override void WriteFullEndElement()
{
base.WriteEndElement();
OnElementEnded();
}
}
public static partial class XNodeExtensions
{
public static void SaveWithCustomFormatting(this XDocument doc, string filename, int indentDepth)
{
using (var textWriter = new StreamWriter(filename))
using (var writer = new CustomFormattingXmlTextWriter(textWriter, indentDepth))
{
doc.Save(writer);
}
}
}
使用它,您可以执行以下操作:
myDoc.SaveWithCustomFormatting(fileName, 1);
根据需要输出:
<ROOTELEMENT>
<CHILDELEMENT><INFO1>Test a 1</INFO1><INFO2>Test a 2</INFO2></CHILDELEMENT>
<CHILDELEMENT><INFO1>Test b 1</INFO1><INFO2>Test b 2</INFO2></CHILDELEMENT>
</ROOTELEMENT>
注释:
您可以修改
CustomFormattingXmlTextWriter.OnElementStarted()
中的逻辑,以使用您想要的任何条件禁用格式设置,例如检查传入的localName
是否为child
。XmlTextWriter
已弃用,取而代之的是XmlWriter
——但后者没有可变的Formatting
属性。如果您必须使用XmlWriter
,您可以查看 Is there a way to serialize multiple XElements onto the same line? 。
演示 fiddle #1 here .
关于c# - XDocument 在一行中写入特定的 XElement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57287775/