2015-01-15 53 views
0

所以我取消设置每个元素从XML字符串XML,如果取消设置节点不能得到变量的值

$xml = <<< XML 
<?xml version="1.0" encoding="UTF-8"?> 
<xml> 
<cars> 
<car_id>26395593</car_id> 
<standart>0</standart> 
<model>2</model> 
</cars> 
</xml> 
XML; 

//加载XML到变量;

$concerts = simplexml_load_string($xml); 

foreach ($concerts->xpath('/*/cars/*') as $child) { 
    $chil = $child; 

    echo "Before= " .$chil ."\n"; 
    unset($child[0]); 
    echo "After= " .$chil ."\n"; 
} 

现在的结果是这样的

Before= 26395593 
After= 
Before= 0 
After= 
Before= 2 
After= 

为什么$chil变量被取消设置吗?如何将$child值保存到变量?

+1

它的正常工作。也许你有不同的代码比问题? http://sandbox.onlinephpfunctions.com/code/d928e46b2dbb29eef9f53f6e40447ba4440c40e5 – Justinas

回答

2

SimpleXML是DOM的抽象。 $ child和$ child [0]是独立的SimpleXMLElement对象,但访问相同的DOM节点。 unset()不仅会删除SimpleXMLElement对象,还会从DOM中删除节点。

所以在第二个SimpleXMLElement对象之后引用一个被删除的DOM节点。

稍加修改你的榜样,你可以得到一个警告吧:

$concerts = simplexml_load_string($xml); 

foreach ($concerts->xpath('/*/cars/*') as $child) { 
    echo "Before= " .$child->asXml() ."\n"; 
    unset($child[0]); 
    echo "After= " .$child->asXml() ."\n"; 
} 

输出:

Before= <car_id>26395593</car_id> 

Warning: SimpleXMLElement::asXML(): Node no longer exists in /tmp/e... on line 19 
After= 
Before= <standart>0</standart> 

Warning: SimpleXMLElement::asXML(): Node no longer exists in /tmp/e... on line 19 
After= 
Before= <model>2</model> 

Warning: SimpleXMLElement::asXML(): Node no longer exists in /tmp/e... on line 19 
After= 

你应该避免解封的SimpleXMLElement对象。如果您需要以其他格式存储数据,请保留原始文档相同,从中读取值并创建新的XML文档。

为 “断开” 从XML节点的值,施放SimpleXMLElement对象为标:

$concerts = simplexml_load_string($xml); 
foreach ($concerts->xpath('/*/cars/*') as $child) { 
    $value = (string)$child;  
    echo "Before= " .$value."\n"; 
    unset($child[0]); 
    echo "After= " .$value ."\n"; 
} 

输出:

Before= 26395593 
After= 26395593 
Before= 0 
After= 0 
Before= 2 
After= 2 
+0

那么你在说什么?如何解决问题? –

+0

你为什么“取消”这个变量?不要取消设置,在取消设置前存储VALUE,... – ThW

+1

演示如何! –