XElement глотает переводы строки исходного xml...
От: mDmitriy Россия  
Дата: 08.05.13 16:12
Оценка: +1
Тестовый код примерно такой:
var array = new[] {"aaaaaaaaa", "bbbbbbbbb", "ccccccccc"};
var join = string.Join(Environment.NewLine, array);
var xml = string.Format("<root attr=\"{0}\">{0}</root>", join);

var xe = XElement.Parse(xml);

var attr = xe.FirstAttribute.Value;
var value = xe.Value;

Значения attr и value ожидаю увидеть равными join... ан нет
в attr символы перевода строки (\r\n) заменены пробелом,
а в value остались только \n, \r куда-то пропали.

Это глюк, или так и должно быть?
И, самое главное — как с этим бороться?
.NET 4.0
xml
Re: XElement глотает переводы строки исходного xml...
От: vvlad.net  
Дата: 08.05.13 16:45
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>Значения attr и value ожидаю увидеть равными join... ан нет

D>в attr символы перевода строки (\r\n) заменены пробелом,
D>а в value остались только \n, \r куда-то пропали.

D>Это глюк, или так и должно быть?

D>И, самое главное — как с этим бороться?

Это нормально.
http://msdn.microsoft.com/ru-ru/library/bb538477.aspx, LoadOptions.PreserveWhitespace
Re[2]: XElement глотает переводы строки исходного xml...
От: Аноним  
Дата: 08.05.13 17:47
Оценка: +1 -1
Здравствуйте, vvlad.net, Вы писали:

VN>Здравствуйте, mDmitriy, Вы писали:


D>>Значения attr и value ожидаю увидеть равными join... ан нет

D>>в attr символы перевода строки (\r\n) заменены пробелом,
D>>а в value остались только \n, \r куда-то пропали.

D>>Это глюк, или так и должно быть?

D>>И, самое главное — как с этим бороться?

VN>Это нормально.

VN>http://msdn.microsoft.com/ru-ru/library/bb538477.aspx, LoadOptions.PreserveWhitespace
Не вижу ничего нормального...
LoadOptions.PreserveWhitespace не имеет отношения к символам перевода строки. И, кстати, не влияет — я проверил.
Re: XElement глотает переводы строки исходного xml...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 08.05.13 17:55
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>а в value остались только \n, \r куда-то пропали.


Стандарт XML, однако.

D>Это глюк, или так и должно быть?


Так и должно быть.

D>И, самое главное — как с этим бороться?


в конце строки для тега. Для атрибута можно попробовать , но не уверен что поможет.
... << RSDN@Home 1.2.0 alpha 5 rev. 99 on Windows 8 6.2.9200.0>>
AVK Blog
Re[2]: XElement глотает переводы строки исходного xml...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 08.05.13 17:55
Оценка:
Здравствуйте, vvlad.net, Вы писали:

VN>Это нормально.

VN>http://msdn.microsoft.com/ru-ru/library/bb538477.aspx, LoadOptions.PreserveWhitespace

Это не поможет.
... << RSDN@Home 1.2.0 alpha 5 rev. 99 on Windows 8 6.2.9200.0>>
AVK Blog
Re[2]: XElement глотает переводы строки исходного xml...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 08.05.13 18:01
Оценка:
Здравствуйте, AndrewVK, Вы писали:

Потерялись символы:

& #13; в конце строки для тега. Для атрибута можно попробовать & #13;& #10;, но не уверен что поможет.
... << RSDN@Home 1.2.0 alpha 5 rev. 99 on Windows 8 6.2.9200.0>>
AVK Blog
Re[3]: XElement глотает переводы строки исходного xml...
От: Gremlin2 http://www.fb2library.net/
Дата: 08.05.13 18:08
Оценка: 4 (2)
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, vvlad.net, Вы писали:


VN>>Здравствуйте, mDmitriy, Вы писали:


D>>>Значения attr и value ожидаю увидеть равными join... ан нет

D>>>в attr символы перевода строки (\r\n) заменены пробелом,
D>>>а в value остались только \n, \r куда-то пропали.

D>>>Это глюк, или так и должно быть?

D>>>И, самое главное — как с этим бороться?

VN>>Это нормально.


А>Не вижу ничего нормального...

А>LoadOptions.PreserveWhitespace не имеет отношения к символам перевода строки. И, кстати, не влияет — я проверил.

Ещё раз: это нормально.
Странно ожидать чего-то другого. Открываем спецификацию XML секцию 3.3.3 Attribute-Value Normalization:


Секция 2.11 End-of-Line Handling:

To simplify the tasks of applications, the XML processor must behave as if it normalized all line breaks in external parsed entities (including the document entity) on input, before parsing, by translating all of the following to a single #xA character:

  1. the two-character sequence #xD #xA
  2. the two-character sequence #xD #x85
  3. the single character #x85
  4. the single character #x2028
  5. any #xD character that is not immediately followed by #xA or #x85.


Жирным выделено оба ваших случая.
Re[3]: XElement глотает переводы строки исходного xml...
От: vvlad.net  
Дата: 08.05.13 18:40
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, vvlad.net, Вы писали:


VN>>Это нормально.

VN>>http://msdn.microsoft.com/ru-ru/library/bb538477.aspx, LoadOptions.PreserveWhitespace

AVK>Это не поможет.

А, ну да — в середине строки...
Re: XElement глотает переводы строки исходного xml...
От: abibok  
Дата: 11.05.13 00:24
Оценка:
<![CDATA[...]]>
Re[2]: XElement глотает переводы строки исходного xml...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 11.05.13 08:07
Оценка:
Здравствуйте, abibok, Вы писали:

A><![CDATA[...]]>


Помнится, это тоже не помогало.
... << RSDN@Home 1.2.0 alpha 5 rev. 99 on Windows 8 6.2.9200.0>>
AVK Blog
Re[4]: XElement глотает переводы строки исходного xml...
От: mDmitriy Россия  
Дата: 13.05.13 04:43
Оценка:
Здравствуйте, Gremlin2, Вы писали:
G>Ещё раз: это нормально.
G>Странно ожидать чего-то другого. Открываем спецификацию XML секцию 3.3.3 Attribute-Value Normalization:

G>

    G>
  • Replace all white space characters with space characters.
    G>
  • Expand character references to characters.
    G>
  • Recursively expand entity references to characters.
    G>
  • If a Document Type Definition (DTD) is present and the attribute is declared as a non-CDATA type, trim leading and trailing space and collapse consecutive white space to a single space.
    G>


G>Секция 2.11 End-of-Line Handling:

G>

To simplify the tasks of applications, the XML processor must behave as if it normalized all line breaks in external parsed entities (including the document entity) on input, before parsing, by translating all of the following to a single #xA character:

G>

    G>
  1. the two-character sequence #xD #xA
    G>
  2. the two-character sequence #xD #x85
    G>
  3. the single character #x85
    G>
  4. the single character #x2028
    G>
  5. any #xD character that is not immediately followed by #xA or #x85.
    G>


G>Жирным выделено оба ваших случая.

Правильно я понимаю, что если встречается такой XML, то его нельзя парсить штатными средствами и надо применять некие бубновые пляски?
Re[4]: А через XmlDocument все работает...
От: mDmitriy Россия  
Дата: 14.05.13 04:44
Оценка:
Здравствуйте, Gremlin2, Вы писали:

var array = new[] { "aaaaaaaaa", "bbbbbbbbb", "ccccccccc" };
var join = string.Join(Environment.NewLine, array);
var xml = string.Format("<root attr=\"{0}\">{0}</root>", join);

var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);

var attr = xmlDoc.DocumentElement.Attributes[0].Value;
var value = xmlDoc.DocumentElement.InnerXml;

Вот так все переводы строк сохраняются в неизменном виде.
Или здесь другой стандарт XML?
Re[5]: А через XmlDocument все работает...
От: Gremlin2 http://www.fb2library.net/
Дата: 14.05.13 06:28
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>Здравствуйте, Gremlin2, Вы писали:


D>Вот так все переводы строк сохраняются в неизменном виде.

D>Или здесь другой стандарт XML?

Все зависит от реализации. Многие парсеры XML соответствуют рекомендациям стандрта, но я рад, что вы нашли для себя работающее рещение. Вот только зачем? Зачем вам переводы строк в атрибутах???
Re[6]: А через XmlDocument все работает...
От: mDmitriy Россия  
Дата: 14.05.13 10:22
Оценка:
Здравствуйте, Gremlin2, Вы писали:

G>Здравствуйте, mDmitriy, Вы писали:


D>>Здравствуйте, Gremlin2, Вы писали:


D>>Вот так все переводы строк сохраняются в неизменном виде.

D>>Или здесь другой стандарт XML?

G>Все зависит от реализации. Многие парсеры XML соответствуют рекомендациям стандрта, но я рад, что вы нашли для себя работающее рещение. Вот только зачем? Зачем вам переводы строк в атрибутах???

Вы совершенно правы, мне они нафиг не нужны... Но вот приходит такой xml от независимого источника и приходится его разбирать...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.