Любопытство при разборе Xml — «больше, чем» в атрибуте

#c# #.net #xml

#c# #.net #xml

Вопрос:

У меня есть некоторый xml, который выглядит следующим образом:

 <rootElement attribute=' > '/>
  

Синтаксические анализаторы, на которых я его пробовал, принимают это как правильно сформированный xml, и соответствующая часть RFC также предполагает, что это допустимо, хотя лично я не был уверен, что это так, пока не проверил (интересно, что это было бы недопустимо, если бы это была открывающая треугольная скобка, но это как закрывающая скобка).

У меня есть некоторый код, который используется для «красивой печати» xml — он должен изменять только длину строк и новые строки — он не должен изменять никакого содержимого. Однако, независимо от того, как я пытаюсь проанализировать этот xml, он всегда заканчивается заменой сущности:

 <rootElement attribute=' amp;> '/>
  

Это не совсем неожиданно, и любой анализатор xml должен рассматривать эти два параметра как идентичные, но для моих целей я не хочу такого поведения, поскольку этот код предназначен для изменения форматирования только xml-файла, а не его содержимого.

Не имеет значения, загружаю ли я свой xml в XmlDocument:

 var xml = "<rootElement attribute=' > '/>";
var doc = new XmlDocument();
doc.LoadXml(xml);
Console.WriteLine(doc.OuterXml);
  

Или элемент XElement:

 var xElement = XElement.Parse(xml);
xElement.Save(Console.Out);
  

Или передайте его через пару чтения / записи:

 using (var ms = new MemoryStream())
using (var streamWriter = new StreamWriter(ms))
{
    streamWriter.Write(xml);
    streamWriter.Flush();
    ms.Position = 0;

    using (var xmlReader = XmlReader.Create(ms))
    {
        xmlReader.Read();
        Console.WriteLine(xmlReader.ReadOuterXml());
    }
}
  

Все они заменяют > сущность на amp;> событие, хотя первое является приемлемым правильно сформированным xml. Я пробовал играть с различными XmlReaderSettings или XElement LoadOptions и т.д., но все безрезультатно.

Кто-нибудь знает какой-либо способ предотвратить это?

Это скорее любопытство, чем реальная проблема, но мне интересно посмотреть, есть ли у кого-нибудь какие-либо решения.

[ОТРЕДАКТИРУЙТЕ, чтобы уточнить, в свете некоторых комментариев / ответов]

Я действительно понимаю, что такое поведение ожидаемо. В моем случае, возможно, я вообще не хочу использовать один из встроенных xml-API (хотя все, что я использую, должно понимать структуру xml, чтобы не прерывать строку в неподходящих местах, где это изменяет семантическое значение документа.)

Мне действительно просто интересно узнать, знает ли кто-нибудь способ изменить поведение в этих анализаторах (я ожидаю, что вы не можете, но полагали, что если бы кто-нибудь знал, они, вероятно, были бы на SO), или если у кого-нибудь есть какие-либо другие идеи.

Комментарии:

1. Дает ли тот же результат заключение > в двойные кавычки вместо одинарных кавычек? Мне просто интересно, есть ли какая-то причина для исключения одного, а не другого.

2. К сожалению, нет — такое же поведение.

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

4. @Rob Levine: Вы написали «Я не хочу такого поведения, поскольку этот код предназначен для изменения форматирования только xml-файла, а не его содержимого». Это не так. До тех пор, пока ваш потребитель правильно обрабатывает XML

5. @Alejandro — это происходит с точки зрения человека, читающего документ. Подумайте о «красивом отпечатке» кнопки «форматировать xml» в вашем любимом редакторе xml. Вероятно, это изменяет длины строк, не превращая > в > Я понимаю, что «пока ваш потребитель правильно обрабатывает XML», они одинаковы — но они не для человеческих глаз, и это код для форматирования xml для удобства чтения человеком. Это не предназначено для изменения чего-либо, кроме длины строк, указанной пользователем.

Ответ №1:

Я предполагаю, что вы обнаружите, что нет способа изменить это — поскольку я сильно подозреваю, что внутреннее представление после загрузки будет одинаковым, независимо от того, было ли оно изначально > или amp;> .

Комментарии:

1. Я подозреваю, что вы правы. В любом случае, для любого анализатора это не имеет никакого значения — они означают одно и то же. Просто в этом довольно узкоспециализированном сценарии было бы неплохо не менять его.

Ответ №2:

Интересно то, что это xr.GetAttribute("attribute") возвращает " > " то, что вы ожидали. Я предполагаю, что при создании XML в ReadOuterXml он кодирует все > как amp;> . Итак, чтобы устранить проблему, вам пришлось бы обрабатывать каждый узел по мере его появления, чтобы его можно было распечатать.

Комментарии:

1. Интересный момент. Я думаю, это просто потому, что getAttribute всегда декодирует значение атрибута — если у вас есть attribute=»>» в качестве значения атрибута, вы получаете то же поведение. Я п одозреваю, как предполагает Джон Скит, что внутренне они оба имеют одно и то же каноническое представление, а конкретные используемые символы потеряны.