2011-05-05 98 views
0

我需要從文件中加載xml到XmlDocument。問題是該文件包含一些領先的空白。 (我無法控制生成該文件的系統。) 是否有任何干淨/簡單的方法來忽略或去除這些字符?如何忽略XML文件中的空白字符?

string SamplelRequestFile = @"C:\example.xml"; 
XmlDocument docXML = new XmlDocument(); 
XmlTextReader xReader = new XmlTextReader(SamplelRequestFile); 
XmlReaderSettings ReaderSettings = new XmlReaderSettings(); 
ReaderSettings.XmlResolver = null; 
ReaderSettings.ProhibitDtd = false; 
docXML.Load(xReader); 

的example.xml(注意前導空格)

<?xml version="1.0" ?> 
<myRoot> 
<someElement /> 
</myRoot> 

回答

4

你只需要像做

using (StreamReader sr = new StreamReader(@"C:\example.xml")) 
{ 
     XmlDocument docXML = new XmlDocument(); 
     docXML.LoadXml(sr.ReadToEnd().Trim()); 
     ... 
} 
+0

這將工作,但只適用於較小的文檔。如果你開始處理非常大的文件,你會遇到問題。一種可能的解決方案是創建一個新的Stream類型讀取XML文件,並拒絕返回字符,直到它找到Feed中的第一個非空白字符。 – 2011-05-05 14:43:35

+0

另一種選擇是嘗試將文檔視爲XML片段,XmlTextReader可能更寬容:http://msdn.microsoft.com/en-us/library/cakk7ha0。aspx – 2011-05-05 14:46:36

+0

這隻有在XML文件編碼爲UTF-8時才起作用,因爲ReadToEnd在默認情況下以UTF-8讀取。 – Daniel 2012-08-27 07:31:05

0

你嘗試過加入這個標誌?

ReaderSettings.IgnoreWhitespace = true; 
+0

是的,但只有一次是在讀過適用於XML。在這種情況下,空格可以防止數據被識別爲可讀的XML。 – 2011-05-05 14:20:12

3

這是一個無效的XML

根據XML規範,PI處理的指令必須是第一個字符,如果存在的話。

我建議你通過修改 XML來預處理XML。


解決方法:

string content = File.ReadAllText(@"C:\example.xml"); 
XmlDocument doc = new XmlDocument(); 
doc.LoadXml(content.Trim()); 
+0

是的,我知道這是無效的XML。但這正是需要解決的問題。 – 2011-05-05 14:16:21

+0

誰給了downvote?等待看到解決方法... – Aliostad 2011-05-05 14:20:12

+0

問題是,這限制了可以通過可用內存量處理的XML大小。如果你有一個2GB的XML文件,你剛剛崩潰了系統。您可能無法控制您的供稿,但他們不會發送XML,您需要讓他們解決它。 – 2011-05-05 14:38:18

1

只要你看到空白,創建從流Stream和文件自己StreamReader,然後Peek()和消耗字符。一旦確定下一個字符是<,請將該流傳遞給XmlTextReader構造函數。

0
string newXml = string.TrimLeft(oldXml); 
2

這裏是工作的一個樣本:

 string file = @"C:\example.xml"; 
     XmlDocument docXML = new XmlDocument(); 
     using (TextReader x = new StreamReader(file)) 
     { 
      while (x.Peek() == ' ') 
       x.Read(); 
      docXML.Load(x); 
     } 
+0

這是最好的解決方案恕我直言 – 2012-08-30 04:23:35