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 ответа:
Если вы хотите сохранить разрывы строк в значениях атрибутов, то вам нужно записать их с помощью ссылок на символы, например
<foo bar="Line 1. Line 2. 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-документ может содержать следующее:
Синтаксический анализатор XML сообщает оба значения атрибутов как<whiteSpaceLoss note1="this is a note." note2="this is a note.">
"this is a note."
, Преобразуя разрывы строк в одиночные пробелы.