IgnoreWhiteSpace不会忽略xml字符串开头的空格

时间:2016-12-15 15:24:15

标签: c# xml xml-parsing xmlreader

问题
是否应该在我的多行字符串文字xml的开头忽略空格?

代码

string XML = @"
            <?xml version=""1.0"" encoding=""utf-8"" ?>"

using (StringReader stringReader = new StringReader(XML))
using (XmlReader xmlReader = XmlReader.Create(stringReader,
    new XmlReaderSettings() { IgnoreWhitespace = true }))
            {
                xmlReader.MoveToContent();
                // further implementation withheld
            }

请注意,在上面的代码中,在XML声明之前有空格,尽管我设置了IgnoreWhiteSpace属性,但这似乎并没有被忽略。我哪里错了?!

注意:当XML字符串没有换行符时,我有相同的行为,只有一个空格,如下所示。我知道如果我删除空格,这将会运行,我的问题是为什么财产没有处理这个?

string XML = @" <?xml version=""1.0"" encoding=""utf-8"" ?>"

2 个答案:

答案 0 :(得分:0)

文档说明IgnoreWhitespace属性将“获取或设置一个值,指示是否忽略无关紧要的空格。”。虽然第一个空格(以及换行符)应该是微不足道的,但制作XmlReader的人显然不这么认为。只需在使用前修剪XML,你就可以了。

如评论中所述,为清楚起见,请将您的代码更改为:

string XML = @"<?xml version=""1.0"" encoding=""utf-8"" ?>"

using (StringReader stringReader = new StringReader(XML.Trim()))
using (XmlReader xmlReader = XmlReader.Create(stringReader,
new XmlReaderSettings() { IgnoreWhitespace = true }))
        {
            xmlReader.MoveToContent();
            // further implementation withheld
        }

答案 1 :(得分:0)

根据Microsoft关于XML Declaration

的文档
  

XML声明通常显示为XML中的第一行   文献。但是,如果使用XML声明,则不需要XML声明   必须是文档中的第一行,没有其他内容或白色   空间可以先于它。

您的代码的解析失败,因为空格位于XML声明之前。删除空格或xml声明将导致成功解析。

换句话说,如果XmlReaderSettings与XML声明的文档不一致,那将是一个错误 - 它是定义的行为。

以下是一些展示上述规则的代码。

using System;
using System.Web;
using System.Xml;
using System.Xml.Linq;

public class Program
{
    public static void Main()
    {
        //The XML declaration is not required, however, if used it must 
        // be the first line in the document and no other content or 
        //white space can precede it.

        // here, no problem because this does not have an XML declaration
            string xml = @"                                                               
                         <xml></xml>";
            XDocument doc = XDocument.Parse(xml);
            Console.WriteLine(doc.Document.Declaration);
            Console.WriteLine(doc.Document);
        //
        // problem here because this does have an XML declaration
        //
        xml = @"                                      
        <?xml version=""1.0"" encoding=""utf-8"" ?><xml></xml>";
        try 
        {
        doc = XDocument.Parse(xml);
            Console.WriteLine(doc.Document.Declaration);
            Console.WriteLine(doc.Document);
        } catch(Exception e) {
            Console.WriteLine(e.Message);
        }

    }
}