Как загрузить неанизированный XML? - PullRequest
3 голосов
/ 30 июля 2009

У нас есть различные XML-файлы, созданные приложением в текущем выпуске. Некоторые из этих файлов, как оказалось, содержат недопустимые символы, что делает их недопустимыми XML-файлами, которые не будут загружаться в большинстве случаев, если вся проверка не отключена, а затем только в XmlDocument экземплярах, а не XDocument.

Поскольку это приложение уже там , мы должны справиться с файлами, которые оно производит. Теперь я мог бы добавить к типу Sanitizer, который знает, что искать и как это исправить, прежде чем пытаться загрузить документ, но я надеялся, что кто-то, возможно, уже приложил усилия для создания чего-то, что, возможно, сделало это уже эффективным способом (например, SanitizedXmlReader класс).

Этот вопрос затрагивает ту же тему, но я не нашел там удовлетворительного ответа. Все, что мы хотим, - это удалить содержимое, которое является недопустимым в любом месте файла XML (а не данные, которые действительны, скажем, только в CDATA или когда они не используются в QName).

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

Ответы [ 3 ]

3 голосов
/ 30 июля 2009

Проблемы

Если вы в конечном итоге напишите свой собственный, то знать, какие символы действительны, определенно немного сложно.

XML 1.1 изменил правила, но давайте предположим, что никто не использует его (потому что вряд ли кто-нибудь), и придерживайтесь 1.0.

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

Ответ

В Java есть небольшой класс XmlChar, в котором есть методы, которые вы можете использовать, чтобы определить, какие символы допустимы для каких конструкций. .Net нет, но проект Mono включает в себя источник System.Xml.XmlChar, который может вам помочь.

Возможно, вы могли бы начать с фильтрации всех символов, которые определенно нигде не разрешены. Метод XmlChar.IsValid(char c) из вышеприведенного класса Mono должен помочь.

Было бы интересно узнать, какие другие типы плохого XML генерирует приложение.

3 голосов
/ 30 июля 2009

Я думаю, что эта ссылка может помочь в этом вопросе - http://seattlesoftware.wordpress.com/tag/hexadecimal-value-0x-is-an-invalid-character/

2 голосов
/ 30 июля 2009

Несколько лет назад я использовал SGMLReader для загрузки дрянного HTML-кода. Это также может помочь вам разобрать неверный XML.

PS: Между тем есть пакет NuGet , а источники доступны на Github .

...