LINQ to XML игнорирует разрывы строк в атрибутах


Согласно этому вопросу:

Допустимы ли разрывы строк в значениях атрибутов XML?

Разрывы строк в атрибутах XML вполне допустимы (хотя, возможно, и не рекомендуются):

<xmltag1>
    <xmltag2 attrib="line 1
line 2
line 3">
    </xmltag2>
</xmltag1>

Когда я разбираю такой XML с помощью LINQ to XML (System.Xml.Linq), эти разрывы строк преобразуются молча в символы пробела ' '.

Есть ли какой-либо способ сказать синтаксическому анализатору XDocument.Load(), чтобы сохранить эти разрывы строк?

С. П.: в XML-разбора я написал стороннего программного обеспечения, так Я не могу изменить способ записи разрывов строк.

3 6

3 ответа:

Если вы хотите сохранить разрывы строк в значениях атрибутов, то вам нужно записать их с помощью ссылок на символы, например

<foo bar="Line 1.&#10;Line 2.&#10;Line3."/>

Как и другие мудрые синтаксический анализатор XML нормализует их к пространствам, в соответствии со спецификацией XML http://www.w3.org/TR/xml/#AVNormalize .

[edit] если вы хотите избежать нормализации значений атрибутов, то загрузка XML с наследием XmlTextReader помогает:

            string testXml = @"<foo bar=""Line 1.
Line 2.
Line 3.""/>";

            XDocument test;
            using (XmlTextReader xtr = new XmlTextReader(new StringReader(testXml)))
            {
                xtr.Normalization = false;
                test = XDocument.Load(xtr);
            }
            Console.WriteLine("|{0}|", test.Root.Attribute("bar").Value);

Что выводит

|Line 1.
Line 2.
Line 3.|

Разрывы строк не являются пробелами при разборе (не ASCII-код 32) Если вы пройдете через каждую букву, вы увидите, что "пробел" - это код ASCII 10 =LF (LineFeed) (!!)- значит, лайнбрейки все еще присутствуют если вам нужно, попробуйте заменить их на ASCII 13 в вашем коде... (текстовые поля (windows forms) не отображают LF как linebreak)

Согласно MSDN:

Хотя XML-процессоры сохраняют все пробелы в содержании элементов, они часто нормализуют их в значениях атрибутов. Табуляции, возврат каретки и пробелы отображаются как отдельные пробелы. В некоторых типах атрибутов они обрезают пробелы, которые идут до или после основной части значения, и сокращают пробелы внутри значения до отдельных пробелов. (Если DTD доступен, эта обрезка будет выполнена для всех атрибутов, которые не являются тип CDATA.)

Например, XML-документ может содержать следующее:

<whiteSpaceLoss note1="this is a note." note2="this
is
a
note.">
Синтаксический анализатор XML сообщает оба значения атрибутов как "this is a note.", Преобразуя разрывы строк в одиночные пробелы.
Я не могу найти ничего о сохранении пробелов атрибутов, но я предполагаю, что это может быть невозможно в соответствии с этим объяснением.