2016-11-24 58 views
-1

我需要读取不符合xml规则的xml文件。所以我需要把它作为一个XML文件阅读之前。它在元素之间存在诸如“&”和“<”之类的符号。C#从xml中删除无效字符

<MAT> 
<MATERIAL><MATNR>2286303</MATNR><BESTELTXT>Parts for something & something else</BESTELTXT><WERKS>Material exist out of<1 something</WERKS> 
</MAT> 

现在我有这样的:

我读取文件中的话,我这

  text = Regex.Replace(text, @"\s&\s", " &amp; "); 
      text = Regex.Replace(text, @"[<]\d+", "&lt;"); 

它后,我写文件中的文本,这我读为XML。

“<”的问题是,它将删除号码,我需要保留。另外我不知道这是否有很好的表现?这也将工作与verry大文件?它也只适用于这种情况,但如果我们在未来有更多案例呢?没有将这些预定义实体更改为其xml格式的一般方法吗?

ps:我知道这应该在xml文件被处理时处理,但它来自一个thirth派对,他们不能改变它。

+3

他们不能改变呢?然后改变那个供应商 –

+0

他们没有提供给你一个有效的XML文件,你不能指望它是一个整体。 – Jamiec

+1

@Thomas是的,这很有趣,但通常情况下,开发人员不是这样做的。 – CodeCaster

回答

1

你应该试试这个

text = Regex.Replace(text, @"(\s+)&(\s+)", "$1&amp;$2"); 
text = Regex.Replace(text, @"[<](\d+)", "&lt;$1"); 
  • 第一个变化是\ s到\ S +选择&即使它由一个以上的空间包围,但是通过使用+这意味着以更低的一个空间。
  • 通过这样做,我能够使用$1谁包含所选号码的值第二个变化\d+(\d+),同样的事情,工作\ S +,如果你有一个以上的选定组的顺序将是$ 1,$ 2等。
  • 以提高性能,您可以添加RegexOptions.Compiled到您的正则表达式,用于为例text = Regex.Replace(text, @"(\s+)&(\s+)", "$1&amp;$2",RegexOptions.Compiled);

此外,如果你想改变你把所有&删除(\s+)

+0

而不是“尝试这个”解释你改变了什么。 – CodeCaster

+0

以及为什么你改了它 –

+0

@CodeCaster就够了吗?我没有解释,因为这些是正则表达式世界中的基本东西 –