Fusionner des fichiers XML en PHP
J'ai 2 fichiers 1.xml
et 2.xml
les deux ayant une structure similaire et j'aimerais en avoir un. J'ai essayé plusieurs solutions mais j'ai eu des erreurs uniquement - pour parler franchement, je n'ai aucune idée de comment ces scripts travaillé.
1.xml
:
<res>
<items total="180">
<item>
<id>1</id>
<title>Title 1</title>
<author>Author 1</author>
</item>
...
</items>
</res>
2.xml
:
<res>
<items total="123">
<item>
<id>190</id>
<title>Title 190</title>
<author>Author 190</author>
</item>
...
</items>
</res>
Je voudrais créer un nouveau fichier merged.xml
avec la structure suivante
<res>
<items total="303">
<item>
<id>1</id>
<title>Title 1</title>
<author>Author 1</author>
</item>
... //items from 1.xml
<item>
<id>190</id>
<title>Title 190</title>
<author>Author 190</author>
</item>
... //items from 2.xml
</items>
</res>
Comment dois-je faire? Pouvez-vous m'expliquer la façon de le faire? Comment puis-je le faire avec plus de fichiers? Grâce
Modifier
Ce que j'ai essayé?
<?php
function mergeXML(&$base, $add)
{
if ( $add->count() != 0 )
$new = $base->addChild($add->getName());
else
$new = $base->addChild($add->getName(), $add);
foreach ($add->attributes() as $a => $b)
{
$new->addAttribute($a, $b);
}
if ( $add->count() != 0 )
{
foreach ($add->children() as $child)
{
mergeXML($new, $child);
}
}
}
$xml = mergeXML(simplexml_load_file('1.xml'), simplexml_load_file('2.xml'));
echo $xml->asXML(merged.xml);
?>
EDIT2
Suivantes Torious conseils j'ai regardé dans DOMDocument manuel et trouvé un exemple:
function joinXML($parent, $child, $tag = null)
{
$DOMChild = new DOMDocument;
$DOMChild->load($child);
$node = $DOMChild->documentElement;
$DOMParent = new DOMDocument;
$DOMParent->formatOutput = true;
$DOMParent->load($parent);
$node = $DOMParent->importNode($node, true);
if ($tag !== null) {
$tag = $DOMParent->getElementsByTagName($tag)->item(0);
$tag->appendChild($node);
} else {
$DOMParent->documentElement->appendChild($node);
}
return $DOMParent->save('merged.xml');
}
joinXML('1.xml', '2.xml')
Mais il crée mauvais fichier xml:
<res>
<items total="180">
<item>
<id>1</id>
<title>Title 1</title>
<author>Author 1</author>
</item>
...
</items>
<res>
<items total="123">
<item>
<id>190</id>
<title>Title 190</title>
<author>Author 190</author>
</item>
...
</items>
</res>
</res>
Et je ne peux pas utiliser correctement ce fichier. J'ai besoin d'une structure correcte et j'ai en sorte de coller un fichier dans un autre. Je voudrais à "coller" point n'est pas toutes les balises. Que dois-je changer?
EDIT3
ici est une fonction de la réponse sur Torious réponse juste adapté à mes besoins - contrôle //édité
$doc1 = new DOMDocument();
$doc1->load('1.xml');
$doc2 = new DOMDocument();
$doc2->load('2.xml');
//get 'res' element of document 1
$res1 = $doc1->getElementsByTagName('items')->item(0); //edited res - items
//iterate over 'item' elements of document 2
$items2 = $doc2->getElementsByTagName('item');
for ($i = 0; $i < $items2->length; $i ++) {
$item2 = $items2->item($i);
//import/copy item from document 2 to document 1
$item1 = $doc1->importNode($item2, true);
//append imported item to document 1 'res' element
$res1->appendChild($item1);
}
$doc1->save('merged.xml'); //edited -added saving into xml file
- Essayez d'utiliser le DOM, start ici. Notez que si vous souhaitez fusionner des documents XML (à partir de différentes
DOMDocument
sources, vous devrez utiliserimportNode
(ou presque) à un certain point dans le temps.
Vous devez vous connecter pour publier un commentaire.
Depuis que vous avez mis un effort, j'ai codé quelque chose qui devrait fonctionner.
Remarque que c'est du code non testé, mais vous obtenez l'idée.
C'est à vous d'en faire de jolies fonctions. Assurez-vous de comprendre ce qu'il se passe, d'être en mesure de travailler avec le DOM sera probablement vous aider dans beaucoup de scénarios pour l'avenir. La chose cool à propos de la DOM standard, c'est que vous ont à peu près les mêmes opérations dans de nombreux langages de programmation/plates-formes.
Je pense que le plus simple est de changer XML à la matrice d'abord, de combiner deux tableau, qui sont beaucoup plus facile et simple. Enfin, changement de tableau au format xml. Il peut vous aide pour la situation lorsque vous souhaitez combiner les deux fichiers XML directement. Vous avez seulement besoin de réfléchir à la clé, c'est la position que vous voulez ajouter les nœuds enfants.
Useage: Créer un SimpleXMLIterator
Comment sur :