2011-05-05 92 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