2016-11-24 107 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就夠了嗎?我沒有解釋,因爲這些是正則表達式世界中的基本東西 –