c# - 删除 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(" />","/>"));
有什么不好的地方我会碰到吗?有没有明显/更标准的方法来做到这一点?看起来很卡顿。
解决方案
如果您的目标系统以与自关闭 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();
}
}
推荐阅读
- javascript - 如何跟踪特定 div 下 HTML 元素的添加?
- reactjs - 错误 npm 运行设置“ERR!代码 ELIFECYCLE”
- php - 表单提交后如何重定向到主页并发送确认电子邮件
- jaws-screen-reader - IE 11 - 页面加载后焦点移动到不同计算机上的不同区域
- c# - 单击 UI 按钮时更改 GUI 按钮文本
- firebase - Chrome Extension + Firebase - 在后台调用firebase.database(),内容和弹出脚本等于每个新连接?
- android - 为drawLine和drawBitmap添加动画
- swift - 在 iOS 中获取基于流派的 Youtube 播放列表
- java - 以下java代码给出输出1 2 3。代码是如何执行的?
- php - 如何使用别名连接多个表