2009-10-16 6 views
31

J'ai essayé d'utiliser SimpleXML, mais il ne semble pas comme XML qui ressemble à ceci:Bibliothèque PHP pour l'analyse XML avec un deux-points dans les noms de tag?

<xhtml:div>sample <xhtml:em>italic</xhtml:em> text</xhtml:div> 

Alors, quelle bibliothèque gérer les balises qui ressemblent à ce que (ont deux points en eux)?

+1

S'il vous plaît poster l'extrait de code correspondant. SimpleXML ne devrait pas avoir de problèmes avec les espaces de noms. –

+0

J'ai également rencontré le même problème avec 'SimpleXMLElement ($ data)' retournant null si les données xml ont des deux-points dans les balises. –

Répondre

64

Supposons que vous ayez du xml comme celui-ci.

<xhtml:div> 
    <xhtml:em>italic</xhtml:em> 
    <date>2010-02-01 06:00</date> 
</xhtml:div> 

Vous pouvez accéder à 'em' comme ceci: $xml->children('xhtml', true)->div->em;

cependant, si vous voulez que le champ de date, celle-ci: $xml->children('xhtml', true)->div->date;ne fonctionnera pas, parce que vous êtes coincé dans l'espace de noms xhtml.

vous devez exécuter à nouveau « enfants » pour revenir à l'espace de noms par défaut:

$xml->children('xhtml', true)->div->children()->date; 
+1

ne sais pas pourquoi ce n'est pas la réponse sélectionnée. Mais pour quelqu'un dans le futur, c'est celui qui a résolu mes questions/problèmes! :) – daveomcd

7

Colon désigne un espace de noms XML. Le DOM a un bon support pour les espaces de noms.

+0

SimpleXML fait probablement aussi, mais l'OP recherche une balise "xhtml: div" au lieu de simplement "div". –

+0

SimpleXML a * quelques * trucs pour y faire face, mais je n'arrive toujours pas à le faire fonctionner correctement. – mpen

18

Si vous voulez corriger rapidement faire ce (je fais quand je me sens paresseux):

// Will replace : in tags and attributes names with _ allowing easy access 
$xml = preg_replace('~(</?|\s)([a-z0-9_]+):~is', '$1$2_', $xml); 

Ceci convertira <xhtml: en <xhtml_ et </xhtml: en </xhtml_. Type de hacky et peut échouer si des blocs de conteneur XML CDATA NameSpaced sont impliqués ou des noms de balises UNICODE mais je dirais que vous êtes généralement en sécurité en l'utilisant (ne m'a pas encore échoué).

+4

C'est sale. Mais bon;) – joedevon

+0

Fonctionne mais c'est un peu hacky .. vissé le contenu de mes balises '' et l'heure a changé – supersan

2

Je ne pense pas que ce soit une bonne idée de se débarrasser du côlon ou de le remplacer par quelque chose d'autre comme certaines personnes l'ont suggéré. Vous pouvez facilement accéder aux éléments qui ont un préfixe d'espace de noms. Vous pouvez transmettre l'URL qui identifie l'espace de noms en tant qu'argument à la méthode children() ou transmettre le préfixe d'espace de noms et "true" à la méthode children(). La deuxième approche nécessite PHP 5.2 et plus.

SimpleXMLElement::children

+0

N'est-ce pas exactement ce que Nathan Reed a suggéré dans la réponse que j'ai acceptée? Je suis d'accord que regex-fu est un hack sale, mais devoir passer par le sélecteur 'children()' n'est pas très amusant non plus. – mpen

+0

Oui, pareil. Je voulais juste indiquer que vous pouvez également passer l'URL qui identifie l'espace de noms à la méthode children() qui fonctionne avec PHP 5 et plus. À mon humble avis, il n'est pas nécessaire de faire un hack sale, quand il existe une méthode de base disponible. –

Questions connexes