IgnoreWhiteSpace не игнорирует пробелы в начале строки xml

Вопрос
Следует ли игнорировать пробелы в начале моего многострочного строкового литерала 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"" ?>"

person George Grainger    schedule 15.12.2016    source источник


Ответы (2)


В документации сказано, что свойство 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
        }
person K Ekegren    schedule 15.12.2016
comment
Спасибо, я знаю, как это исправить, чтобы он работал. Что я искал, так это границы свойства Ignore WhiteSpace и почему в данном случае оно не работает. - person George Grainger; 15.12.2016

Согласно документации Microsoft относительно 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);
        }

    }
}
person RamblinRose    schedule 15.12.2016