首页 > 解决方案 > 删除 XDocument.ToString() 中空元素中的额外空间

问题描述

我正在将 XML 消息发送到无法处理标记中的空格的系统。值中的空格是可以的。我一直在使用 linq/XDocument/XElements 来操作/生成消息。

问题是元素何时为空。例如:

XDocument xdoc = XDocument.Parse("<root><value/></root>");
Console.WriteLine(xdoc.ToString(SaveOptions.DisableFormatting));

这会在元素标题之后的标记中输出一个带有空格的字符串,即使DisableFormatting是打开的。

<root><value /></root>

所以我只是在上面贴了一个替换:

Console.WriteLine(xdoc.ToString(SaveOptions.DisableFormatting).Replace(" />","/>"));

有什么不好的地方我会碰到吗?有没有明显/更标准的方法来做到这一点?看起来很卡顿。

标签: c#linq-to-xml

解决方案


如果您的目标系统以与自关闭 xml 元素相同的方式处理空 xml 元素 -通常,两者都被认为是相等的(但请考虑这篇文章中的评论) - 您可以实现XmlWriter输出自关闭 xml 标记的自定义作为空的 xml 标签。
空 xml 标记不会在其标记中包含任何空格,例如。<value></value>.

下面示例中的自定义XmlTextWriter生成以下 xml。
请注意<value></value>标签,并且保留了 的空白值valueWithWhitespace

<root><value></value><valueWithWhitespace>   </valueWithWhitespace></root>

var xml = XElement.Parse(
    "<root><value /><valueWithWhitespace>   </valueWithWhitespace></root>",
    LoadOptions.PreserveWhitespace
    );

var stringWriter = new StringWriter();
using (var xmlWriter = new CustomXmlTextWriter(stringWriter))
{
    xml.WriteTo(xmlWriter);
    xmlWriter.Flush();
    Console.WriteLine(stringWriter);
}

public class CustomXmlTextWriter : XmlTextWriter
{
    public CustomXmlTextWriter(TextWriter writer)
        : base(writer)
    {}

    public CustomXmlTextWriter(Stream stream, Encoding encoding)
        : base(stream, encoding)
    {}

    public CustomXmlTextWriter(string filename, Encoding encoding)
        : base(filename, encoding)
    {}

    public override void WriteEndElement()
    {
        this.WriteFullEndElement();
    } 
}

推荐阅读