Aller au contenu

simplexml (Php5)


Sujets conseillés

Posté

Mon fichier xml contient

<?xml version="1.0" encoding="ISO-8859-1" ?>

<html>

<head>

<title>Titre du site</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

<link href="css/screen.css" rel="stylesheet" media="screen" type="text/css" />

</head>

<body>

<div id="cadregeneral">

contenu du site

</div>

</body>

</html>

en php, je fais

$racine = simplexml_load_file ( $fichierxml );

print_r( $racine );

Et j'obtiens

SimpleXMLElement Object ( [head] => SimpleXMLElement Object ( [title] => Titre du site [meta] => SimpleXMLElement Object ( ) [link] => SimpleXMLElement Object ( ) ) [body] => SimpleXMLElement Object ( [div] => contenu du site ) )

Mais où est passée la balise html ?

Comment faire pour avoir également la balise html ?

Merci d'avance.

Gilbert

Posté

La balise <html>, c'est simplement $racine :)

Si tu veux la balise html, bah tu peux faire $racine['html'] = simplexml_load_file ( $fichierxml ) mais je ne suis pas sûr d'en saisir l'intérêt. Pour rappel on ne peut avoir qu'un élément racine par fichier XML...

Posté

Je veux la première balise. Or, elle n,'apparaît pas dans le résultat.

Je sais qu'il n'y a qu'une seule racine, un fichier xml est un arbre. Mais je veux savoir laquelle et quelles sont ses propriétés <html lang=fr ...

Posté

Par exemple, si mon fichier contient

<?xml version="1.0" encoding="ISO-8859-1" ?>

<toto>

<head>

<title>Titre du site</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

<link href="css/screen.css" rel="stylesheet" media="screen" type="text/css" />

</head>

<body>

<div id="cadregeneral">

contenu du site

</div>

</body>

</toto>

J'obtiens le même résultat qu'avec html comme balise racine. Or, clairement, le fichier ne contient pas le même arbre, donc le même objet. Et je ne vais pas faire le traitement dans les 2 cas. Là, je ne vois pas l'information essentielle du fichier XML à savoir la balise racine, donc le type d'objet manipulé !

Posté

SimpleXMl a plein de limitations, tu viens simplement de tomber sur l'une d'elle. Et franchement, c'est probablement la plus petite.

L'idée d'une interface objet plus simple que DOM était bonne, la réalisation est complètement bancale et sorti de quelques cas bien spécifiques (lecture d'un fichier de configuration XML très hiérarchique par exemple), SimpleXML me semble de moins en moins utile.

Pour ton problème où tu utilises DOM de bout en bout, ou tu fais une conversion SimpleXML -> DOM sur l'objet pour après lire le nom de l'élément. Il est possible que la conversion ne consomme presque aucune ressource (vu que ça utilise les mêmes structures de la libxml en interne), il faudrait vérifier.

Posté
SimpleXMl a plein de limitations, tu viens simplement de tomber sur l'une d'elle. Et franchement, c'est probablement la plus petite.

Limitation ? C'edst un choix délibéré, non ? Enfin, c'est pareil.

L'idée d'une interface objet plus simple que DOM était bonne, la réalisation est complètement bancale et sorti de quelques cas bien spécifiques (lecture d'un fichier de configuration XML très hiérarchique par exemple), SimpleXML me semble de moins en moins utile.

Pourtant, c'est simple. J'avais noté que c'était un des progrès les plus importants de Php5 et j'attendais ça avec impatience.

Pour ton problème où tu utilises DOM de bout en bout, ou tu fais une conversion SimpleXML -> DOM sur l'objet pour après lire le nom de l'élément. Il est possible que la conversion ne consomme presque aucune ressource (vu que ça utilise les mêmes structures de la libxml en interne), il faudrait vérifier.

Pour le moment, je crois que je vais continuer à utiliser mon petit script qui transorme un fichier XML en objets. Il marche bien.

Comment ferait-on avec DOM seul en reprenant mon exemple ?

Gilbert

Posté

Pour les limitations elles sont souvent volontaires, mais il n'empêche qu'elles sont très sérieuses. Au chapitre des trucs innacceptables : l'accès aux éléments avec espace de nom qui est imbitable, et l'impossibilité pour simplexml de faire la différence entre <test> et <!-- test --> (ce qui est tout de même plutot étonnant pour un moteur xml)

Tout le monde a attendu ça avec impatience et effectivement c'est simple. Mais en fait ils ont développé ça sans faire de réflexion et sans penser la chose. Au final c'est mal foutu (et encore, ça aurait pu être pire, il ont tout refait au moment des béta).

avec DOM je n'ai pas la syntaxe en tête et je ne suis pas chez moi pour regarder mes codes. Je te donne ça dans quelques jours si tu me le rappelles et que personne n'a répondu entre temps. Mais c'est grosso modo la même chose pour obtenir ça :

- chargement du doc

- récupération du noeud racine à partir du doc

- récupération du nom de tag du noeud racine

Le problème de SimpleXML c'est que tu ne peux pas avoir le nom d'un noeud à partir du noeud lui même, mais uniquement à partir de son parent ... et que par défaut tu obtiens déjà l'élément racine (et non /)

Posté (modifié)
La balise <html>, c'est simplement $racine :)

Si tu veux la balise html, bah tu peux faire $racine['html'] = simplexml_load_file ( $fichierxml ) mais je ne suis pas sûr d'en saisir l'intérêt. Pour rappel on ne peut avoir qu'un élément racine par fichier XML...

Le document peut être considéré comme la racine. On peut très bien avoir :

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!-- ici commencent mes infos -->
<html>
 <head>
 </head>
 <body>
 </body>
</html>
<!-- la fin des haricots -->

Le document a trois fils :

Un nud commentaire, un nud élément (le seul et unique enfant élément du document, appelé « document element » ou « root », voilà l'ambiguité :/), et un dernier nud commentaire.

Un coup de DOM inspector dans Firefox permet de bien voir ça aussi :) Donc effectivement ça serait plus logique que la fonction de chargement retourne une référence sur le document plutôt que sur le premier élément du document.

Je lis le sujet car on m'a fait part de problèmes de la part de ce module. J'ai une question d'ailleurs concernant les encodage. XML est parfait pour l'Unicode, mais PHP... Est-ce que PHP5 fait de l'unicode pour les chaines désormais ?

<?xml version="1.0" encoding="UTF-8" ?>
<config>
 <letters>
 <θ>plop</θ>
 <Ψ>onk<Ψ>
 </letters>
</config>

Peut-on faire ça :

$config = simplexml_load_string($strFileName);
echo $config->letters->Ψ;

?

Ou alors c'est toujours les États-Unis le seul pays au monde et l'ascii le seul encodage existant ?

Modifié par Hadrien

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...