Подтвердить что ты не робот

Чтение XML с помощью "&" в С# XMLDocument Object

Я унаследовал плохо написанное веб-приложение, которое, похоже, имеет ошибки при попытке чтения в XML-документе, хранящемся в базе данных с "&". в этом. Например, будет тег с содержимым: "Prepaid and Charge". Есть ли какая-то секретная простая вещь, чтобы она не получала ошибку при разборе этого персонажа, или я пропущу что-то очевидное?

EDIT: Существуют ли какие-либо другие символы, которые могут вызывать ошибку такого же типа для синтаксического анализатора, если они не были правильно сформированы?

4b9b3361

Ответ 1

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

Prepaid & Charge

Я должен был решить ту же проблему раньше, и я сделал это с этим регулярным выражением:

Regex badAmpersand = new Regex("&(?![a-zA-Z]{2,6};|#[0-9]{2,4};)");

Объедините это с строковой константой, определенной следующим образом:

const string goodAmpersand = "&";

Теперь вы можете просто сказать badAmpersand.Replace(<your input>, goodAmpersand);

Обратите внимание, что простой String.Replace("&", "&amp;") недостаточно хорош, так как вы заранее не можете заранее знать, будет ли какой-либо символ кодироваться правильно, неправильно или даже в том же документе.

Уловы здесь в том, что вы должны сделать это в своем документе xml, прежде чем загружать его в свой синтаксический анализатор, что, вероятно, означает дополнительный проход через него. Кроме того, он не учитывает амперсанды внутри раздела CDATA. Наконец, он захватывает только амперсанды, а не другие незаконные символы, такие как <. Обновление: на основе комментария, мне нужно обновить выражение для шестнадцатеричных (& #x...;) объектов.

Относительно того, какие символы могут вызвать проблемы, фактические правила немного сложны. Например, определенные символы разрешены в данных, но не как первая буква имени элемента. И нет простого списка незаконных символов. Вместо этого большой (несмежный) валок UNICODE определяется как юридический, и все, что за пределами этого, является незаконным.

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

О, и примечание о предложении CDATA: я использовал бы это, чтобы убедиться, что созданный мной xml хорошо сформирован, но когда вы имеете дело с существующим xml извне, я нахожу метод regex проще.

Ответ 2

Веб-приложение не виновато, XML-документ. Амперсанды в XML должны быть закодированы как &amp;. Несоблюдение этого требования является синтаксической ошибкой.

Изменить: в ответ на следующий вопрос, да есть всевозможные подобные ошибки. Например, несбалансированные теги, незакодированные символы меньше, без знака атрибутов, октеты за пределами кодировки символов и различные странности Unicode, непризнанные ссылки на сущности и т.д. Для того чтобы любой достойный анализатор XML потреблял документ, этот документ должен быть хорошо сформирован. Спецификация XML требует, чтобы синтаксический анализатор, столкнувшийся с некорректным документом, выдавал фатальную ошибку.

Ответ 3

Другие ответы правильны, и я согласен с их советом, но позвольте мне добавить только одно:

ПОЖАЛУЙСТА, не делайте приложения, которые работают с неразработанным XML, это просто усложняет остальную часть нашей жизни:).

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

Возможно, вы могли бы сделать еще один шаг и сказать "Ack! Этот XML сломан в этих местах и ​​по этим причинам, вот как я попытался исправить его, чтобы сделать его хорошо сформированным:...".

Я не слишком знаком с API-интерфейсами MSXML, но большинство хороших синтаксических анализаторов XML позволят вам установить обработчики ошибок, чтобы вы могли уловить точный номер строки/столбца, где появляются ошибки, а также получение кода ошибки и сообщения.

Ответ 4

В вашей базе данных нет документов XML. Он содержит некоторые хорошо сформированные XML-документы и некоторые строки, которые выглядят как XML для человека.

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

Ответ 5

Вы можете заменить и &amp;

Или вы также можете использовать разделы CDATA.

Ответ 6

Существует несколько символов, которые будут приводить к тому, что данные XML будут отображаться как плохо сформированные.

От w3schools:

Такие символы, как "<" и "&" являются незаконными в элементах XML.

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

<![CDATA[This is my wonderful & great user text]]>

Все теги <![CDATA[ и ]]> игнорируются синтаксическим анализатором.