【问题标题】:How to ignore leading whitespace in XML file?如何忽略 XML 文件中的前导空格?
【发布时间】:2012-08-27 16:50:00
【问题描述】:

我需要将文件中的 xml 加载到 XmlDocument 中。问题是该文件包含一些前导空格。 (我无法控制生成文件的系统。) 是否有任何干净/简单的方法可以忽略或删除这些字符?

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>

【问题讨论】:

    标签: c# xml xmldocument


    【解决方案1】:

    你只需要做类似的事情

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

    【讨论】:

    • 这将起作用,但仅适用于较小的文档。如果您开始处理非常大的文档,您将遇到问题。一种可能的解决方案是创建一个新的 Stream 类型来读取 XML 文件,并且在找到提要中的第一个非空白字符之前拒绝返回字符。
    • 另一种选择是尝试将文档视为 XML 片段,XmlTextReader 可能更宽容:msdn.microsoft.com/en-us/library/cakk7ha0.aspx
    • 这只有在 XML 文件是 UTF-8 编码时才有效,因为 ReadToEnd 默认以 UTF-8 读取。
    【解决方案2】:

    这是一个无效的 XML

    根据 XML 规范,piprocessing-instructions 必须是第一个字符(如果存在)。

    我建议您通过修剪 XML 来预处理 XML。


    解决方法:

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

    【讨论】:

    • 是的,我知道这是无效的 XML。但这正是需要解决的问题。
    • 问题是,这限制了可用内存量可以处理的 XML 的大小。如果您有这些 2gb XML 文件之一,那么您刚刚崩溃了系统。您可能无法控制您的提要,但它们没有发送 XML,您需要让他们修复它。
    • 关于大文件的要点。关于“让他们修复它”,对话可能是这样的:你好,十亿美元公司?我想和我们一直这样做部门的人谈谈。当然,我会坚持... ;-)
    • 很公平 :) 同时,就像我上面建议的那样,创建自己的流,在请求开始时简单地省略任何空白字符可能会奏效......
    • 同样,这仅在 XML 文件是 UTF-8 编码时才有效,因为 ReadAllText 默认以 UTF-8 读取。
    【解决方案3】:

    这是一个有效的示例:

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

    【讨论】:

    • 这是最好的解决方案恕我直言
    【解决方案4】:

    自己在文件上创建StreamStreamReader,然后Peek() 并在您看到空格时使用流中的字符。一旦确定下一个字符是&lt;,就将流传递给XmlTextReader 构造函数。

    【讨论】:

      【解决方案5】:

      你试过添加这个标志吗?

      ReaderSettings.IgnoreWhitespace = true;
      

      【讨论】:

      • 是的,但这仅适用于读入后的 XML。在这种情况下,空格会阻止数据被识别为可读的 XML。
      【解决方案6】:
      string newXml = string.TrimLeft(oldXml);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多