2014-04-21 4 views
0

J'ai un fichier XML comme ceci:ajoutant nœud de niveau supérieur précédent dans un nouveau nœud de niveau supérieur SimpleXML

<?xml version="1.0"?> 
<export> 
    <config> 
    <Exported Name="test"> 
     <values> 
     <node name="yellow" /> 
     <node name="green" /> 
     <node name="red" /> 
     </values> 
    </Exported> 
    </config> 
</export> 

Alors que je sais comment ajouter un attribut suivant la documentation PHP pour SimpleXML http://www.php.net/manual/en/simplexmlelement.addattribute.php

Qu'est-ce que Je ne suis pas sûr si c'est possible de faire ce que j'ai dans un autre tag. Exemple je veux changer ci-dessus pour:

<?xml version="1.0"?> 
<main> 
    <cust> 
     [email protected] 
    </cust> 
    <export> 
     <config> 
     <Exported Name="test"> 
      <values> 
      <node name="yellow" /> 
      <node name="green" /> 
      <node name="red" /> 
      </values> 
     </Exported> 
     </config> 
    </export> 
</main> 

Donc, fondamentalement, ce que je suis en train de faire est la création d'un nouveau nœud de niveau supérieur appelé principal et de mettre un nouvel attribut Cust et en ajoutant une valeur, puis en ajoutant l'exportation de nœud de niveau supérieur précédent à l'intérieur le noeud principal après l'attribut cust. Je voudrais idéalement utiliser simpleXML mais je me demande quelle est la meilleure façon de le faire, lire tout depuis l'exportation, et tout cracher en boucle, est-ce la meilleure méthode pour le faire ou y a-t-il un façon de simplement dire imprimer tout le nœud d'exportation ici plutôt que de lire à peu près tout le XML et d'avoir à boucler et reconstruire tout juste pour ajouter 2 nouveaux nœuds?

Répondre

1

Cela ne fonctionne pas avec SimpleXML mais avec DOMDocument qui permet d'importer des nœuds de manière récursive d'un document à l'autre. Heureusement SimpleXML est juste une façade au-dessus de DomDocument en PHP et les noeuds peuvent être importés de SimpleXML à DOM et dans les DOM d'un document à l'autre:

$xml = new SimpleXMLElement('<?xml version="1.0"?> 
<export> 
    <config> 
    <Exported Name="test"> 
     <values> 
     <node name="yellow" /> 
     <node name="green" /> 
     <node name="red" /> 
     </values> 
    </Exported> 
    </config> 
</export>'); 

$target = new SimpleXMLElement('<?xml version="1.0"?> 
<main> 
    <cust> 
     [email protected] 
    </cust> 
</main>'); 

$cust = dom_import_simplexml($target->cust); 

$cust->parentNode->appendChild(
    $cust->ownerDocument->importNode(dom_import_simplexml($xml), true) 
); 

$target->asXML('php://output'); 

Sortie:

<?xml version="1.0"?> 
<main> 
    <cust> 
     [email protected] 
    </cust> 
<export> 
    <config> 
    <Exported Name="test"> 
     <values> 
     <node name="yellow"/> 
     <node name="green"/> 
     <node name="red"/> 
     </values> 
    </Exported> 
    </config> 
</export></main> 
1

Il semble que SimpleXML n'autorise pas une telle manipulation. Son contenu de nœud facile à remplacer par un simple texte; Mais si j'essaie de mettre XML ou SimpleXMLElement de cette façon, j'échoue.

$xml->config->Exported->values = '<a>asd</a>'; 

produit «& lt; a & gt; asd & lt;/a & gt; ». J'ai également essayé d'appeler le conctructeur de SimpleXMLElement pour créer un contenu de noeud et l'insérer dans un autre noeud.

$xml->config->Exported->values = new SimpleXMLElement… 

Il insère juste de l'espace. Ainsi, en utilisant SimpleXML, seule la solution est de scanner XML et d'en créer un nouveau. À mon avis, la façon la plus efficace de réorganiser XML est XSLT.

Questions connexes