Position actuelle: Accueil> Derniers articles> Comment gérer et réparer les balises XML non valides dans XML_PARSE

Comment gérer et réparer les balises XML non valides dans XML_PARSE

M66 2025-04-28

Lorsque l'analyse des données XML utilisant la fonction XML_PARSE () de PHP, l'analyse échoue souvent en raison de balises XML non valides ou mal formées. Cette situation est particulièrement courante dans les chaînes XML entrées par les utilisateurs, ou les données provenant de sources non fiables (telles que les API externes, téléchargées par des tiers). Cet article expliquera comment gérer ces erreurs gracieusement et essayer de résoudre automatiquement les problèmes courants pour éviter les erreurs d'analyse.

1. Comprendre comment fonctionne xml_parse ()

XML_PARSE () fait partie de l'analyseur XML de PHP (basé sur la bibliothèque Expat) qui analyse les données XML via une manière motivée par des événements:

 $parser = xml_parser_create();
xml_parse($parser, $xmlString, true);
xml_parser_free($parser);

Si le XML dans $ XMLString n'est pas valide, la fonction renvoie False et vous pouvez obtenir des informations d'erreur détaillées via xml_get_error_code () et xml_error_string () .

2. Problèmes de XML invalides communs

  1. L'étiquette n'est pas fermée:

     <note><to>Tove</to><from>Jani</note>
    
  2. Les caractères spéciaux ne sont pas échappés:

     <message>5 < 10 & 7 > 3</message>
    
  3. Personnages non autorisés ou encodages illégaux

  4. Mauvaise structure imbriquée

3. Stratégie de réparation automatique

Lorsque vous devez faire face à XML non standard ou corrompu, vous pouvez utiliser certaines stratégies pour le prétraiter ou le réparer:

1. Essayez d'utiliser l'analyse tolérante fournie par libxml

La classe DomDocument de PHP permet la désactivation des rapports d'erreur lors du chargement de XML, essayant ainsi d'être tolérant aux pannes:

 libxml_use_internal_errors(true);

$doc = new DOMDocument();
$success = $doc->loadXML($xmlString);

if (!$success) {
    foreach (libxml_get_errors() as $error) {
        echo "Réparer les suggestions:" . $error->message . "\n";
    }
    libxml_clear_errors();
}

Bien que cette méthode ne soit pas corrigée, elle peut vous dire ce qui ne va pas.

2. Réglez manuellement les problèmes courants (comme les caractères d'évasion)

Si vous connaissez la structure de XML, vous pouvez le réparer par remplacement régulier ou de chaîne:

 function sanitizeXml($xml) {
    // Remplacer illégal & personnage
    $xml = preg_replace('/&(?!amp;|lt;|gt;|quot;|apos;)/', '&amp;', $xml);

    // D&#39;autres règles peuvent être terminées au besoin
    return $xml;
}

3. Catch des erreurs et rétrogradation du traitement

Vous pouvez envelopper l'analyse XML dans une fonction et un traitement de rétrogradation une fois qu'il échoue, tels que le stockage des journaux, le marquage de l'état de données, etc.:

 function safeXmlParse($xmlString) {
    $parser = xml_parser_create();

    if (!xml_parse($parser, $xmlString, true)) {
        $error = xml_error_string(xml_get_error_code($parser));
        $line = xml_get_current_line_number($parser);
        error_log("XMLL&#39;analyse a échoué: $error at line $line");

        // Facultatif:Informer l&#39;administrateur ou sauter l&#39;enregistrement
        return false;
    }

    xml_parser_free($parser);
    return true;
}

4. cas pratiques

Supposons que vous obteniez des données XML à partir d'une URL https://api.m66.net/feed :

 $url = "https://api.m66.net/feed";
$xmlData = file_get_contents($url);
$xmlData = sanitizeXml($xmlData);

if (!safeXmlParse($xmlData)) {
    echo "Impossible d&#39;analyser cela XML données,Erreur enregistrée。\n";
} else {
    echo "XML Analyse réussie!\n";
}

5. CONSEILS: PRÉMOISSANCE À l'aide d'outils externes

Pour des XML particulièrement déroutants, vous pouvez utiliser des outils externes tels que Tridy , XMllint ou BeautifulSoup de Python pour nettoyer puis l'importer dans PHP pour le traitement.

Résumer

La clé pour gérer les erreurs d'analyse XML réside dans le prétraitement + tolérance d'erreur + mécanisme de récupération de tolérance aux défauts. Bien que XML_Parse () soit une méthode d'analyse XML basique mais stricte, elle peut considérablement améliorer la compatibilité du XML irrégulier avec DOM, libxml, stratégies de réparation manuelle et autres méthodes.

La prochaine fois que vous ferez face à une "défaillance de l'analyse XML mystérieuse", vous pourriez aussi bien essayer ces méthodes!