Ответ 1
Этот "XML" хуже недействительного - он не корректен; см. Хорошо сформированный против действительного XML.
Неформальная оценка предсказуемости нарушений не помогает. Эти текстовые данные не являются XML. Никакие совместимые XML-инструменты или библиотеки не могут помочь вам в этом.
Варианты, наиболее желательные в первую очередь:
- Попросите поставщика решить проблему с их стороны. Требуйте правильно сформированный XML. (Технически фраза правильно сформированный XML избыточна, но может быть полезна для акцента.)
-
Используйте допустимый синтаксический анализатор разметки, чтобы очистить проблему перед синтаксическим анализом как XML:
-
Автономный: xmlstarlet обладает надежными возможностями восстановления и восстановления. Кредит: РоманПерехрест
xmlstarlet fo -o -R -H -D bad.xml 2>/dev/null
-
Автономный и C: HTML Tidy также работает с XML.
- Python: Beautiful Soup основан на Python. Смотрите примечания в разделе Различия между парсерами. См. Также ответы на этот вопрос для получения дополнительных предложений по работе с неправильно сформированной разметкой в Python. Смотрите также этот ответ о том, как использовать
codecs.EncodedFile()
для очистки недопустимых символов. - Java: JSoup фокусируется на HTML.
FilterInputStream
может использоваться для предварительной очистки. - .СЕТЬ:
- XmlReaderSettings.CheckCharacters можно отключить, чтобы обойти проблемы с недопустимыми символами XML.
- @jdweng отмечает, что для
XmlReaderSettings.ConformanceLevel
может быть установлено значениеConformanceLevel.Fragment
чтобыXmlReader
мог читать корректно проанализированные XML-объекты, в которых отсутствует корневой элемент. - @jdweng также сообщает, что
XmlReader.ReadToFollowing()
иногда можно использовать для обхода синтаксических проблем XML, но обратите внимание на предупреждение о нарушении правил в # 3 ниже. -
Microsoft.Language.Xml.XMLParser
называется "устойчивым к ошибкам".
- PHP: см. DOMDocument :: $ recovery и libxml_use_internal_errors (true). Смотрите хороший пример здесь.
- Рубин: Нокогири поддерживает " Нежную форму ".
- R: См. HtmlTreeParse() для разбора отказоустойчивой разметки в R.
-
-
Обработайте данные как текст вручную, используя текстовый редактор или программно, используя символьные/строковые функции. Выполнение этого программно может варьироваться от сложного до невозможного, поскольку то, что кажется предсказуемым, часто не бывает - нарушение правил редко связано правилами.
- Для ошибок недопустимых символов используйте regex для удаления/замены недопустимых символов:
- PHP:
preg_replace('/[^\x{0009}\x{000a}\x{000d}\x{0020}-\x{D7FF}\x{E000}-\x{FFFD}]+/u', ' ', $s);
- Ruby:
string.tr("^\u{0009}\u{000a}\u{000d}\u{0020}-\u{D7FF}\u{E000}-\u{FFFD}", ' ')
- JavaScript:
inputStr.replace(/[^\x09\x0A\x0D\x20-\xFF\x85\xA0-\uD7FF\uE000-\uFDCF\uFDE0-\uFFFD]/gm, '')
- PHP:
-
Для амперсандов используйте регулярное выражение, чтобы заменить совпадения на
&
: credit: blhsin, demo&(?!(?:#\d+|#x[0-9a-f]+|\w+);)
Обратите внимание, что приведенные выше регулярные выражения не будут учитывать комментарии или разделы CDATA.
- Для ошибок недопустимых символов используйте regex для удаления/замены недопустимых символов: