2010-09-15 18 views
0

Après avoir appris how to "correctly" unset a node, j'ai remarqué que l'utilisation de la fonction unset() de PHP laisse les onglets et les espaces derrière. Alors maintenant, j'ai ce gros morceau d'espace blanc entre les nœuds à la fois. Je me demande si PHP itère à travers des espaces/retours/onglets vides et si cela finira par ralentir le système.L'espace supplémentaire ralentit-il le processeur?

Je demande également s'il est facile de retirer l'espace des feuilles laissées à l'abandon?

Merci, Ryan

AJOUTÉE NOTE:

Voici comment je l'ai enlevé les espaces blancs après MHS un nœud et cela a fonctionné pour moi.

$dom = new DOMDocument(); 
$dom->preserveWhiteSpace = false; 
$dom->formatOutput = true; 
$dom->load($xmlPath); 
$dom->save($xmlPath); 

Répondre

3

Que cela ralentisse le processus: probablement peu à prendre en compte.

Et simpleXML est juste cela, simple. Si vous avez besoin d'une sortie «jolie», DOM est votre ami:

<?php 
$xml = ' 
<xml> 
     <node>foo </node> 
     <other>bar</other> 
</xml>'; 
$x = new SimpleXMLElement($xml); 
unset($x->other); 
echo $x->asXML(); 

$dom = new DOMDocument(); 
$dom->preserveWhiteSpace = false; 
$dom->formatOutput = true; 
$dom->loadXML($xml); 
$dom->documentElement->removeChild($dom->documentElement->lastChild); 
echo $dom->saveXML(); 
+0

Remplacé "proper" par "pretty" pour éviter tout malentendu sur la propreté d'un document XML "désordonné". –

+0

Est-ce l'équivalent de unset? $ dom-> documentElement-> removeChild ($ dom-> documentElement-> lastChild); Puis-je ignorer cette ligne si je veux juste formater la sortie? Merci, Ryan – NightHawk

+0

Oui, cette ligne était juste pour faire une manipulation DOM aléatoire, et peut facilement être omise. Si vous voulez formater la sortie de SimpleXML, il n'est pas rare d'importer le résultat dans DOM et d'appeler le fichier saveXML pour avoir un joli formatage. – Wrikken

3

L'espace dans XML est TextNodes, par ex.

<foo> 
    <bar>baz</bar> 
</foo> 

est vraiment

<foo><- whitespace node 
    -><bar>baz</bar><- whitespace node 
-></foo> 

Si vous supprimez le nœud <bar>, vous obtenez

<foo><- whitespace node 
    -><- whitespace node 
-></foo> 

Je pense que SimpleXML vous permettra pas d'accéder aux nœuds de texte facilement (peut-être via XPath), mais DOM fait. Voir Wrikken's answer pour plus de détails. Maintenant que vous savez que les espaces blancs sont des nœuds, vous pouvez aussi imaginer que l'analyser dans un nœud prend des cycles de cpu. Cependant, je dirais que l'impact de la vitesse est négligeable. En cas de doute, faites un benchmark avec quelques données du monde réel.


EDIT: La preuve que les espaces sont des noeuds vraiment

$xml = <<< XML 
<foo> 
    <bar>baz</bar> 
</foo> 
XML; 

$dom = new DOMDocument; 
$dom->loadXML($xml); 
foreach($dom->documentElement->childNodes as $node) { 
    var_dump($node); 
} 

donne

object(DOMText)#4 (0) {} 
object(DOMElement)#6 (0) {} 
object(DOMText)#4 (0) {} 
+0

Vous n'impliquez pas que les espaces sont des tags?! ;-) De plus, Libxml peut distinguer les nœuds d'espaces blancs du texte, en fait XMLReader a 2 types d'espaces. – Robin

+0

XPath serait bien '' // text() [normalize-space() = ''] ', mais ceux-ci seront supprimés au chargement si preserveWhiteSpace est false. – Wrikken

+1

@Robin: Je pense que Gordon voulait dire que ce sont des nœuds réels. – Wrikken

0

Il est en fait Libxml qui fait l'analyse syntaxique XML, des espaces est lu par l'analyseur le même que tous les autres caractères du flux d'entrée (ou fichier). La plupart des API PHP xml utilisent Libxml sous le capot (XmlReader, XmlWriter, SimpleXml Xslt, Dom ...) - certains d'entre eux vous donnent accès aux espaces (par exemple Dom, XmlReader), d'autres pas (par exemple SimpleXML)

0

réponses rapides aux questions posées:

Je me demande si PHP itère à travers espaces vides/retours/onglets et si il finirait par ralentir le système .

Non, PHP (ou libxml) ne le parcourt pas vraiment.Avoir plus d'espace théoriquement ralentit le système, bien qu'il soit si petit qu'il ne peut pas être mesuré directement. Vous pouvez tester cela par vous-même en supprimant tous les espaces de votre XML. Cela ne le rendrait pas plus rapide.

Je demande également s'il y a un facile à enlever l'espace feuilles unset derrière?

Non facile J'ai peur. Vous pouvez importer votre stuff SimpleXML dans DOM et utiliser formatOutput pour remodeler complètement les espaces, comme suggéré dans une autre réponse, ou vous pouvez utiliser une bibliothèque tierce qui le fera pour vous, mais vous ne trouverez pas un facile, intégré façon de le faire.