2012-10-08 4 views
0

J'ai écrit une petite fonction d'aide pour faire une recherche de base remplacer en utilisant xpath, parce que j'ai trouvé facile d'écrire des manipulations très courtes et en même temps faciles à lire et à comprendre.génération de php xml avec xpath

code:

<?php 
function xml_search_replace($dom, $search_replace_rules) { 
    if (!is_array($search_replace_rules)) { 
     return; 
    } 

    $xp = new DOMXPath($dom); 

    foreach ($search_replace_rules as $search_pattern => $replacement) { 
     foreach ($xp->query($search_pattern) as $node) { 
      $node->nodeValue = $replacement; 
     } 
    } 
} 

Le problème est que maintenant je dois faire différent « rechercher/remplacer » sur différentes parties du dom XML. J'avais espéré quelque chose comme le suivant fonctionnerait, mais DOMXPath ne peut pas utiliser DOMDocumentFragment :(

La première partie (jusqu'à la boucle de foreach) de l'exemple ci-dessous fonctionne comme un charme. Je cherche l'inspiration pour une alternative moyen de contourner ce qui est encore à court et lisible (sans plaque signalétique beaucoup de chaudière)

code:.

<?php 
$dom = new DOMDocument; 
$dom->loadXml(file_get_contents('container.xml')); 
$payload = $dom->getElementsByTagName('Payload')->item(0); 

xml_search_replace($dom, array('//MessageReference' => 'SRV4-ID00000000001')); 

$payloadXmlTemplate = file_get_contents('payload_template.xml'); 
foreach (array(array('id' => 'some_id_1'), 
       array('id' => 'some_id_2')) as $request) { 
    $fragment = $dom->createDocumentFragment(); 
    $fragment->appendXML($payloadXmlTemplate); 
    xml_search_replace($fragment, array('//PayloadElement' => $request['id'])); 

    $payload->appendChild($fragment); 
} 
+0

Ce n'est pas vraiment une question. Peut-être est-il mieux adapté à [codereview] (http://codereview.stackexchange.com). Je ne suis pas sûr pourquoi vous avez besoin d'un fragment de doc ici. Si vous voulez définir un contexte pour vos requêtes, ['query' prend un argument de noeud de contexte] (http://php.net/manual/en/domxpath.query.php). –

+0

Je ne connaissais pas codereview désolé ... mais votre suggestion était exactement la perspicacité que je cherchais. Jamais vraiment XML en PHP et le nombre de nouvelles classes a été un peu écrasante. Si vous le dites en réponse, je choisirai cela. – Jacob

Répondre

0

Merci à Francis Avila Je suis venu avec ce qui suit:

<?php 
function xml_search_replace($node, $search_replace_rules) { 
    if (!is_array($search_replace_rules)) { 
     return; 
    } 

    $xp = new DOMXPath($node->ownerDocument); 

    foreach ($search_replace_rules as $search_pattern => $replacement) { 
     foreach ($xp->query($search_pattern, $node) as $matchingNode) { 
      $matchingNode->nodeValue = $replacement; 
     } 
    } 
} 

$dom = new DOMDocument; 
$dom->loadXml(file_get_contents('container.xml')); 
$payload = $dom->getElementsByTagName('Payload')->item(0); 

xml_search_replace($dom->documentElement, array('//MessageReference' => 'SRV4-ID00000000001')); 

$payloadXmlTemplate = file_get_contents('payload_template.xml'); 
foreach (array(array('id' => 'some_id_1'), 
       array('id' => 'some_id_2')) as $request) { 
    $fragment = $dom->createDocumentFragment(); 
    $fragment->appendXML($payloadXmlTemplate); 
    xml_search_replace($payload->appendChild($fragment), 
         array('//PayloadElement' => $request['id'])); 
}