2010-01-12 11 views
1

J'essaye d'analyser une chaîne XML contenant les caractères & < et> dans le TEXTDATA. Normalement, ces caractères doivent être htmlencoded, mais dans mon cas ils ne le sont pas, donc je reçois les messages suivants:PHP DOMDocument-> loadXML avec XML contenant esperluette/moins/plus grand?

Avertissement: DOMDocument :: loadXML() [fonction.loadXML]: erreur lors de l'analyse du nom de l'attribut dans l'entité ... Avertissement: DOMDocument :: loadXML() [function.loadXML]: Impossible de trouver la fin de Start Tag ...

je peux utiliser le str_replace pour encoder tous les &, mais si je le fais avec < ou> Je le fais aussi pour des balises XML valides.

Est-ce que quelqu'un sait une solution de contournement pour ce problème ??

Merci!

+3

La solution de contournement pour XML non-bien formé est de blâmer le gars qui l'a écrit :) – OcuS

Répondre

5

Si vous avez un texte à l'intérieur < dans un fichier XML ... ce n'est pas un XML valide. Essayez de l'encoder ou de les inclure dans <![CDATA[. Si ce n'est pas possible (parce que vous ne sortez pas ce "XML"), je suggère d'essayer avec une bibliothèque d'analyse Html (je ne les ai pas utilisées, mais elles existent) car elles sont moins strictes que Ceux en XML.

Mais j'essayerais vraiment d'obtenir du XML valide avant d'essayer autre chose !!

+0

Merci pour le conseil. Je vais d'abord voir s'il est possible de changer le flux XML entrant, et sinon, je vais essayer l'analyseur HTML ... – nikola

3

J'utilise souvent @ devant des appels à load() pour DomDocument principalement parce que vous ne pouvez jamais être absolument sûr de ce que vous chargez, c'est ce que vous attendiez.

L'utilisation de @ supprimera les erreurs.

@$dom->loadXml($myXml); 
0

Mettez tout votre texte dans les éléments CDATA?

<!-- Old --> 
<blah> 
    x & y < 3 
</blah> 

<!-- New --> 
<blah><![CDATA[ 
    x & y < 3 
]]></blah> 
1

je peux utiliser le str_replace pour encoder tous les &, mais si je le fais avec < ou> Je le fais pour les balises XML valides aussi.

En tant que mesure fixup strictement temporaire, vous pouvez remplacer ceux qui ne font pas partie de ce qui ressemble à une référence de balise ou entité, par exemple .:

$str= preg_replace('<(?![a-zA-Z_!?])', '&lt;', $str); 
$str= preg_replace('&(?!([a-zA-Z]+|#[0-9]+|#x[0-9a-fA-F]+);)', '&amp;', $str); 

Toutefois, ce n'est pas étanche à l'eau et à plus long terme, vous devez corriger tout ce qui génère ce bogue balisage, ou crier à la personne qui a besoin de le réparer jusqu'à ce qu'ils obtiennent un indice. Le XML grossièrement non-formé comme ceci est simplement pas XML par définition.