Maison >Java >Comment analyser du XML invalide (erreur/mal formé) ?

Comment analyser du XML invalide (erreur/mal formé) ?

PHPz
PHPzavant
2024-02-09 23:20:40762parcourir

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.

Contenu de la question

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 ?

Solution de contournement

"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.

Options, idéal en premier :

  1. 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.)

  2. Utilisez un analyseur de balises tolérantpour résoudre les problèmes avant d'analyser en XML :

  3. 使用文本编辑器手动将数据处理为文本或 以编程方式使用字符/字符串函数。这样做 以编程方式可以从棘手到不可能作为 看起来是什么 可预测的往往不是——打破规则很少受到规则的约束

    • 对于无效字符错误,请使用正则表达式删除/替换无效字符:

      • 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, '')
    • 对于与号,使用正则表达式将匹配项替换为 &amp;: 信用:blhsin演示 p>

      &amp;(?!(?:#\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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer