2014-02-17 18 views
1

我有一些XML,我建立,看起来像这样:中的XElement删除空白关闭标签

<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

我不知道的方式使用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解析器,这不是很好,自闭标签中的空白不应该有所作为。

+0

是的,就客户(国防部)而言,他们“一直这样做了很长时间”,而且会花费很长时间国会采取行动让他们改变它。 – Kevin

+0

我喜欢这样,因为我可以在内存中扫描文档。让我试试看看它是如何为我工作的。 – Kevin

+0

这对我来说很好。谢谢! – Kevin

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); 
+0

我可能会尝试对此进行修改,以便我可以在文档处于内存中并且尚未保存在文件中时对其进行循环。我现在就试试。 – Kevin

+1

谢谢,塞尔曼!即使我没有选择你的答案,我很感激你的时间和精力来帮助我。 – Kevin

+0

@KevinJ它是okey.I很高兴如果我可以帮助:) –