删除XElement结束标记中的空格

时间:2014-02-17 18:23:45

标签: c# xml xelement

我正在构建一些看起来像这样的XML:

<actionitem actiontaken="none" target="0" targetvariable="0">
  <windowname>Popup Window</windowname>
  <windowposx>-1</windowposx>
  <windowposy>-1</windowposy>
  <windowwidth>-1</windowwidth>
  <windowheight>-1</windowheight>
  <noscrollbars>false</noscrollbars>
  <nomenubar />
  <notoolbar />
  <noresize />
  <nostatus />
  <nolocation />
  <browserWnd />
</actionitem>

此XML必须符合客户端的确切规范,这意味着我不能在结束标记中包含空格。我知道MSDN说的是这个:

  

当写一个空元素时,在标记名和之间添加一个额外的空格   例如,结束标记。这提供了与旧版浏览器的兼容性。

但是,客户不会/不能为此做出让步。所以,我想我可以尝试这样的方法来解决这个问题:

xelement.ReplaceWith(" />", "/>");

但是当我运行程序时,我收到此错误消息:

Non white space characters cannot be added to content.

Error message

那么,有没有人知道我在构建XML文档后如何删除该空格?

2 个答案:

答案 0 :(得分:2)

我不知道使用XElement的方法,最好的选择是将Xml作为文本读取,但为了避免不必要的多余字符串分配,请通过字符串来完成助洗剂:

var element = new XElement...;

var stringBuilder = new StringBuilder();

using (var stringWriter = new StringWriter(stringBuilder))
{
    element.Save(stringWriter);
}

stringBuilder.Replace(" />", "/>");
var xml = stringBuilder.ToString();

Console.WriteLine(xml);

任何执行.ToString().Replace()的方法在内存使用方面的代价都会高得多。

关于客户评论的令人担忧的事情是,听起来他们有一个自制的xml解析器并不是很好,自闭标签中的空白应该没有什么区别。

答案 1 :(得分:1)

我会将XML内容视为文字,然后Replace这样的空格:

var lines = File.ReadAllLines("path");
for(int i=0;i<lines.Length;i++)
{
   if (lines[i].Contains(" />")) lines[i] = lines[i].Replace(" />", "/>");
}
File.WriteAllLines("path", lines);