L'éditeur PHP Baicao vous présente comment analyser les fichiers XML invalides. Lors du traitement de fichiers XML, vous rencontrez parfois du XML non valide, peut-être parce qu'il n'est pas bien formé ou qu'il contient des erreurs. L'analyse des fichiers XML invalides est une tâche importante pour garantir que nous obtenons correctement les données requises. Pour résoudre ce problème, nous pouvons utiliser les fonctions et bibliothèques intégrées de PHP pour vérifier et corriger le XML invalide. Ci-dessous, nous présenterons en détail plusieurs méthodes couramment utilisées pour analyser les fichiers XML invalides.
Actuellement, je travaille sur une fonctionnalité qui consiste à analyser le XML que nous recevons d'autres produits. J'ai décidé d'effectuer des tests sur certaines données client réelles et il semble que d'autres produits permettent aux utilisateurs de saisir des entrées qui devraient être considérées comme invalides. Quoi qu'il en soit, je dois encore essayer de trouver un moyen de l'analyser. Nous utilisons javax.xml.parsers.documentbuilder
et j'obtiens l'erreur suivante lors de la saisie.
<xml> ... <description>Example:Description:<THIS-IS-PART-OF-DESCRIPTION></description> ... </xml>
Comme vous le savez peut-être, la description semble contenir une balise invalide (d30036ddc824403d51b03f80ff62bdc4
)。现在,这个描述标签被认为是叶标签,并且内部不应该有任何嵌套标签。无论如何,这仍然是一个问题,并在 documentbuilder.parse(...)
une exception est générée sur
Je sais que ce n'est pas du XML invalide, mais il est, comme on pouvait s'y attendre, invalide. Avez-vous des idées sur les moyens d'analyser une telle entrée ?
"xml" est pire que invalide - il n'est pas bien formé ; voir bien formé vs. xml valide.
Les évaluations informelles de la prévisibilité des violations ne sont pas utiles. Les données texte ne sont pas XML. Il n’existe aucun outil ni bibliothèque XML cohérent qui puisse vous aider à y faire face.
Laissez le fournisseur résoudre le problème lui-même. Nécessite un fichier XML bien formé. (Techniquement, le terme xml bien formé est redondant, mais peut aider à mettre l'accent.)
Utilisez un analyseur de balises tolérantpour résoudre les problèmes avant d'analyser en XML :
Autonome : xmlstarlet avec de puissantes fonctionnalités de récupération et de réparation Crédit : romanperekhrest
xmlstarlet fo -o -r -h -d bad.xml 2>/dev/null
Autonome et c/c++ : html Tidy fonctionne et peut également utiliser XML. taggle est un portage de tagsoup vers c++.
python : Beautiful Soup est basé sur python. Voir les notes dans la section Différences entre les analyseurs. Voir aussi Réponse à cette questionpour plus d'informations
Conseils sur la gestion des balises mal formées en python,
L'option recover=true
pour lxml est spécifiquement incluse.
Voir aussi cette réponsepour savoir comment utiliser codecs.encodedfile()
pour nettoyer les caractères illégaux.
java : tagsoup et jsoup se concentrent sur le HTML. filterinputstream
peut être utilisé pour le nettoyage avant traitement.
.net :
xmlreadersettings。 conformancelevel
可以设置为
conformancelevel.fragment
这样 xmlreader
可以读取缺少根元素的 xml 格式良好的解析实体 .xmlreader.readtofollowing()
有时可以
用于解决 xml 语法问题,但请注意
下面#3 中的违规警告。microsoft.language.xml.xmlparser
据说是“容错”的。转到:设置decoder.strict
到 false
,如示例所示,作者:@chuckx。
php:请参阅domdocument::$recover 和 libxml_use_internal_errors(true)。请参阅此处的好示例。
ruby:nokogiri 支持“温和的 well-形式性”。
r:请参阅htmltreeparse() 用于 r 中的容错标记解析。
perl:请参阅xml::liberal ,一个“超级自由的 xml 解析器,可以解析损坏的 xml。”
使用文本编辑器手动将数据处理为文本或 以编程方式使用字符/字符串函数。这样做 以编程方式可以从棘手到不可能作为 看起来是什么 可预测的往往不是——打破规则很少受到规则的约束。
对于无效字符错误,请使用正则表达式删除/替换无效字符:
preg_replace('/[^\x{0009}\x{000a}\x{000d} \x{0020}-\x{d7ff}\x{e000}-\x{fffd}]+/u', ' ', $s);
string.tr ("^\u{0009}\u{000a}\u{000d}\u{0020}-\u{d7ff}\u{e000}-\u{fffd}", ' ')
inputstr.replace (/[^\x09\x0a\x0d\x20-\xff\x85\xa0-\ud7ff\ue000-\ufdcf\ufde0-\ufffd]/gm, '')
对于与号,使用正则表达式将匹配项替换为 &
: 信用:blhsin,演示 p>
&(?!(?:#\d+|#x[0-9a-f]+|\w+);)
请注意,上述正则表达式不会接受注释或 cdata
按照设计,标准 xml 解析器永远不会接受无效的 xml。
您唯一的选择是在解析输入之前预处理输入以删除“可预见的无效”内容,或将其包装在 cdata 中。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!