#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=»>» в качестве значения атрибута, вы получаете то же поведение. Я п одозреваю, как предполагает Джон Скит, что внутренне они оба имеют одно и то же каноническое представление, а конкретные используемые символы потеряны.