Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-使用简单XML复制XML节点_Php_Xml_Simplexml - Fatal编程技术网

PHP-使用简单XML复制XML节点

PHP-使用简单XML复制XML节点,php,xml,simplexml,Php,Xml,Simplexml,我需要使用简单XML加载一个XML源,复制一个现有节点及其所有子节点,然后在呈现XML之前自定义这个新节点的属性。有什么建议吗?SimpleXML无法做到这一点,因此您必须使用。好消息是DOM和SimpleXML是同一枚硬币libxml的两面。因此,无论您使用的是SimpleXML还是DOM,都是在同一棵树上工作。下面是一个例子: $thing = simplexml_load_string( '<thing> <node n="1"><ch

我需要使用简单XML加载一个XML源,复制一个现有节点及其所有子节点,然后在呈现XML之前自定义这个新节点的属性。有什么建议吗?

SimpleXML无法做到这一点,因此您必须使用。好消息是DOM和SimpleXML是同一枚硬币libxml的两面。因此,无论您使用的是SimpleXML还是DOM,都是在同一棵树上工作。下面是一个例子:

$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();
$thing=simplexml\u load\u字符串(
'
'
);
$dom\u thing=dom\u import\u simplexml($thing);
$dom\u node=dom\u import\u simplexml($thing->node);
$dom_new=$dom_thing->appendChild($dom_node->cloneNode(true));
$new\u node=simplexml\u import\u dom($dom\u new);
$new_node['n']=2;
echo$thing->asXML();

如果您经常做这种事情,您可以尝试,这是SimpleXML的一个扩展,它允许您直接使用DOM的方法,而无需转换DOM对象

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();
包括“SimpleDOM.php”;
$thing=simpledom\u load\u字符串(
'
'
);
$new=$thing->appendChild($thing->node->cloneNode(true));
$new['n']=2;
echo$thing->asXML();

对于SimpleXML,我发现最好的方法是解决问题。这是一个很好的bobo,但它很有效:

// 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
//去掉它,这样就不会通过引用传递
$newNode=newsimplexmlement($xml->someNode->asXML());
//修改您的值
$newnode['attribute']=$attValue;
//在需要时为其创建虚拟占位符
$xml->addChild('replaceMe');
//在空的伪节点上执行字符串替换
$xml=str_replace(“”,$newNode->asXML(),$xml->asXML());
//转换回对象
$xml=新的simplexmlement($xml);#如果需要xml,请省略此选项

由于这是SimpleXML中似乎没有的功能的一种解决方法,您需要知道,我认为这会破坏到目前为止您定义的任何对象引用(如果有的话)。

+1推荐DOM。我在使用simpleXML时遇到了许多问题。永远不要使用SimpleXML,DOM功能更强大,使用起来也不难。我必须注意到这一点,因为这一点非常重要。我不后悔花半个小时用DOM重写我的脚本。现在它更直接,更容易维护。喜欢这个答案,如此简单,效果非常好。我不得不稍微调整一下答案,因为“$newNode->asXML()”正在写出XML头,而不仅仅是原始XML片段:$domNode=dom\u import\u simplexml($newNode)$xml=str_replace(“”,$domNode->ownerDocument->saveXML($domNode),$xml->asXML());