PHP - Basit XML kullanarak yinelenen XML düğümü

3 Cevap php

Ben, Basit XML kullanarak bir XML kaynağını yüklemek bütün çocukları ile varolan bir düğüm çoğaltmak, daha sonra XML işleme önce bu yeni düğüm bir öznitelik özelleştirmek gerekir. Herhangi bir öneri?

3 Cevap

SimpleXML bunu yapamaz, bu yüzden kullanmak gerekecek DOM. İyi haber DOM ve SimpleXML aynı sikke, libxml iki taraf olmasıdır. Yani SimpleXML veya DOM kullanarak ister olursa olsun, aynı ağacın üzerinde çalışıyoruz. İşte bir örnek:

$thing = simplexml_load_string(
    '<thing>
        <node n="1"><child/></node>
    </thing>'
);

$dom_thing = dom_import_simplexml($thing);
$dom_node  = dom_import_simplexml($thing->node);
$dom_new   = $dom_thing->appendChild($dom_node->cloneNode(true));

$new_node  = simplexml_import_dom($dom_new);
$new_node['n'] = 2;

echo $thing->asXML();

Eğer bu tür bir şey bir sürü yapıyor iseniz, size DOM nesneleri ve dönüştürme olmadan, doğrudan DOM yöntemlerini kullanmanıza olanak tanır SimpleXML bir uzantısı olduğu, SimpleDOM deneyebilirsiniz.

include 'SimpleDOM.php';
$thing = simpledom_load_string(
    '<thing>
        <node n="1"><child/></node>
    </thing>'
);

$new = $thing->appendChild($thing->node->cloneNode(true));
$new['n'] = 2;

echo $thing->asXML();

SimpleXML, ben buldum en iyi yolu, bir çözüm değildir. Oldukça bobo, ama o çalışıyor:

// Strip it out so it's not passed by reference
$newNode = new SimpleXMLElement($xml->someNode->asXML());

// Modify your value
$newnode['attribute'] = $attValue;

// Create a dummy placeholder for it wherever you need it
$xml->addChild('replaceMe');

// Do a string replace on the empty fake node
$xml = str_replace('<replaceMe/>',$newNode->asXML(),$xml->asXML());

// Convert back to the object
$xml = new SimpleXMLElement($xml); # leave this out if you want the xml

Bu SimpleXML orada olmak için görünmüyor bir özellik için bir çözüm olduğundan, ben varsa bu, bu noktaya kadar tanımlı olduğunuz herhangi bir nesne başvurularını kıracak beklediğinin farkında olması gerekir.

Aşağıdaki deneyin

// Get the node you need
$node = $xml->root->someNode->nodetoDuplicate[0];

// Edit the node
$node["someAttribute"] = "newValue";

// Add node as a child
$xml->root->someNode[0].addChild($node);