如果未设置节点无法获取变量值,则 XML
Posted
技术标签:
【中文标题】如果未设置节点无法获取变量值,则 XML【英文标题】:XML if unset node cant get variable value 【发布时间】:2015-03-13 15:14:44 【问题描述】:所以我从 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
值保存到变量中?
【问题讨论】:
一切正常。也许您的代码与所讨论的不同? sandbox.onlinephpfunctions.com/code/… 【参考方案1】: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
【讨论】:
为什么要“取消设置”变量?不要取消设置,在取消设置之前存储 VALUE,... 将 SimpleXmlElement 转换为字符串。以上是关于如果未设置节点无法获取变量值,则 XML的主要内容,如果未能解决你的问题,请参考以下文章