Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

XML DomDocument et "ignoreWhite"

2 réponses
Avatar
taupe
Salut à tous,

Il semble que la classe DomDocument native dans php5 n'ignore pas les sauts
de ligne dans un xml et que du coup il m'ajoute des nodes non désirés. Par
exemple pour un xml comme ça :

<root>
<item><titre>A</titre></item>
<item><titre>B</titre></item>
</root>

... il me dit que root contient 5 childNodes au lieu de 2. Si je vire tout
les sauts de ligne du xml il me renvoit bien 2 childNodes. Comment régler ce
problème ? En actionscript il existe une propriété nommée ignoreWhite qui
sert justement à ça mais je ne trouve pas d'équivalent en php !

Aussi je n'arrive pas à utiliser la méthode getElementsByTagName.

$dom = new DomDocument();
$dom->load('xml/poste.xml');

foreach ($dom->firstChild->childNodes as $child) {
$tmp = $child->getElementsByTagName('titre');
echo $tmp->nodeName;
}

J'obtiens cette erreur, comme si l'objet renvoyé par getElementsByTagName
n'était pas un noeud xml :

Notice: Undefined property: DOMNodeList::$nodeName (etc...)

Si vous savez comment ça marche, je veux bien un coup de main.
Merci !

taupe

2 réponses

Avatar
Mickael Wolff
Bonjour,


Il semble que la classe DomDocument native dans php5 n'ignore pas les sauts
de ligne dans un xml et que du coup il m'ajoute des nodes non désirés. Par
exemple pour un xml comme ça :


Ben non, il ne les ajoute pas. Ils sont bien là. Ce sont des n½uds qui
doivent être données.

... il me dit que root contient 5 childNodes au lieu de 2. Si je vire tout
les sauts de ligne du xml il me renvoit bien 2 childNodes. Comment régler ce
problème ?


Et pourtant il y a cinq n½uds.

En actionscript il existe une propriété nommée ignoreWhite qui
sert justement à ça mais je ne trouve pas d'équivalent en php !


http://fr2.php.net/manual/fr/ref.dom.php
Propriété DOMDocument::PreserveWhiteSpace, mais je ne penses pas que
ça résolves ton problème. Ce que tu peux faire, c'est d'utiliser DOMXPath :

$doc = new DOMDocument() ;
$doc->load('xml/poste.xml') ;
$doc->preserveWhiteSpace = false;
$butcher = new DOMXPath($doc) ;

$meet = $butcher->query('//*') ;
assert($meet->length == 5) ;

$meet = $butcher->query('//root/*') ;
assert($meet->length == 2) ;

Note que c'est un peut le bazooka d'utiliser XPath :

$meet $doc->getElementsByTagName('root')->item(0)->getElementsByTagName('item') ;

Aussi je n'arrive pas à utiliser la méthode getElementsByTagName.


[...]

J'obtiens cette erreur, comme si l'objet renvoyé par getElementsByTagName
n'était pas un noeud xml :

Notice: Undefined property: DOMNodeList::$nodeName (etc...)


Comme l'indique la documentation, comme le suppose le nom de la
fonction, et comme l'indique le message d'erreur, c'est un objet
DOMNodeList qui est renvoyé ;)

echo $tmp->item(0)->nodeName ;
echo $tmp->item(1)->nodeName ;

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org

Avatar
taupe
$doc->preserveWhiteSpace = false;


Voila c'est ce que je cherchais.
Merci.