如果未设置节点无法获取变量值,则 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的主要内容,如果未能解决你的问题,请参考以下文章

代码运行时未设置变量值。代码如下

未分配 SSIS 脚本任务变量值

公共变量值未重置

如果存储过程失败,则在执行 SQL 任务中将输出变量值获取到 ssis 变量中

Swift 解决Debugger中左侧无法获取变量值的问题

无法在 Java 8 中设置实例变量值