Как предотвратить System.Xml.XmlDocument от экранирования значений атрибутов - PullRequest
1 голос
/ 12 ноября 2009

У меня есть документ XML для работы с такими атрибутами, как:

<action name="foo -> bar">

Если я сделаю простое:

XmlDocument doc = new XmlDocument();
doc.Load(stInPath);
doc.Save(stOutPath);

Строка атрибута экранирована:

<action name="foo -&gt; bar">

Именно это я и хотел бы предотвратить.

Знаете ли вы какой-либо способ сделать это (кроме как сделать целый поиск и замену в XML-файле впоследствии)?

Редактировать: Кажется, это законное поведение, и мне не нужно об этом беспокоиться (см. Ответ Джона Скита)

Ответы [ 2 ]

5 голосов
/ 12 ноября 2009

Почему вам не нужно применять этот побег?

Любой нормальный синтаксический анализатор должен затем применять соответствующий "unescinging", когда он анализирует его. Похоже, вы пытаетесь проверить полученный XML-документ как текстовый документ, что редко является хорошей идеей. Документы XML должны почти всегда передаваться в анализаторы XML на следующем шаге, после чего это не проблема.

Я не знаю ни одного способа помешать библиотекам .NET XML сделать это, и я был бы несколько удивлен, если бы у них была такая возможность.

4 голосов
/ 12 ноября 2009

Именно это я и хотел бы предотвратить.

В самом деле? Вообще не важно, применяется ли это экранирование; информационный набор XML для обоих одинаков.

Я, честно говоря, немного удивлен, что документ загружается вообще.

> - это совершенно допустимый символ, включаемый в значение атрибута. Единственное место, в котором > может потребоваться , чтобы быть & -экранированным в XML, - это последовательность ]]> в текстовом содержимом из-за неясного и глупого правила в спецификации.

Чтобы не думать о проблеме, многие сериализаторы XML обычно экранируют > в любом месте текстового содержимого или значений атрибутов.

Спецификация Canonical XML определяет один конкретный способ сериализации XML-документа, чтобы выходные данные можно было сравнивать как простую строку; например, в нем указано, как именно должны быть упорядочены атрибуты. Канонический XML поддерживает > -экранирование в текстовом содержимом, но отрицает его в значениях атрибутов. Таким образом, если вы использовали сериализатор Canonical XML для вывода документа, вы получите ожидаемый результат для этого конкретного значения. (Я не могу гарантировать, что это выглядело бы так, как вы хотите для других примеров.)

Вы можете получить канонизатор в .NET, используя XmlDsigC14NTransform (или, возможно, XmlDsigC14NWithCommentsTransform), что-то вроде:

XmlDsigC14NTransform transform= new XmlDsigC14NTransform(false);
transform.LoadInput(doc);
Stream stream= (Stream) t.GetOutput(typeof(Stream));
// write stream to file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...