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
Здравствуйте, mDmitriy, Вы писали:
D>Значения attr и value ожидаю увидеть равными join... ан нет D>в attr символы перевода строки (\r\n) заменены пробелом, D>а в value остались только \n, \r куда-то пропали.
D>Это глюк, или так и должно быть? D>И, самое главное — как с этим бороться?
Здравствуйте, 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 не имеет отношения к символам перевода строки. И, кстати, не влияет — я проверил.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, 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:
Replace all white space characters with space characters.
Expand character references to characters.
Recursively expand entity references to characters.
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.
Секция 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:
the two-character sequence #xD #xA
the two-character sequence #xD #x85
the single character #x85
the single character #x2028
any #xD character that is not immediately followed by #xA or #x85.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, vvlad.net, Вы писали:
VN>>Это нормально. VN>>http://msdn.microsoft.com/ru-ru/library/bb538477.aspx, LoadOptions.PreserveWhitespace
AVK>Это не поможет.
А, ну да — в середине строки...
Здравствуйте, 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>the two-character sequence #xD #xA
G>the two-character sequence #xD #x85
G>the single character #x85
G>the single character #x2028
G>any #xD character that is not immediately followed by #xA or #x85.
G>
G>Жирным выделено оба ваших случая.
Правильно я понимаю, что если встречается такой XML, то его нельзя парсить штатными средствами и надо применять некие бубновые пляски?
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?
Здравствуйте, mDmitriy, Вы писали:
D>Здравствуйте, Gremlin2, Вы писали:
D>Вот так все переводы строк сохраняются в неизменном виде. D>Или здесь другой стандарт XML?
Все зависит от реализации. Многие парсеры XML соответствуют рекомендациям стандрта, но я рад, что вы нашли для себя работающее рещение. Вот только зачем? Зачем вам переводы строк в атрибутах???
Здравствуйте, Gremlin2, Вы писали:
G>Здравствуйте, mDmitriy, Вы писали:
D>>Здравствуйте, Gremlin2, Вы писали:
D>>Вот так все переводы строк сохраняются в неизменном виде. D>>Или здесь другой стандарт XML?
G>Все зависит от реализации. Многие парсеры XML соответствуют рекомендациям стандрта, но я рад, что вы нашли для себя работающее рещение. Вот только зачем? Зачем вам переводы строк в атрибутах???
Вы совершенно правы, мне они нафиг не нужны... Но вот приходит такой xml от независимого источника и приходится его разбирать...