Simplexml有多个标签

时间:2014-10-22 11:00:47

标签: php simplexml

在simplexml的所有例子中,我看到xml的结构如下:

<examples>
<example>
</example>
<example>
</example>
<example>
</example>
</examples>

但是我正在以下列形式处理xml:

 <examples>
    <example>
    </example>
    <example>
    </example>
    <example>
    </example>
</examples>
<app>
<appdata>
<error>
<Details> 
 <ErrorCode>101</ErrorCode> 
 <ErrorDescription>Invalid Username and Password</ErrorDescription> 
 <ErrorSeverity>3</ErrorSeverity> 
 <ErrorSource /> 
 <ErrorDetails /> 
</Details>
</error>
<items>
<item>
</item>
<item>
</item>
</items>
</appdata>
</app>

我想跳过示例内容,直接转到app标签,检查错误代码是否存在,如果没有,请转到items数组并循环遍历它。

我目前的处理方式是:

$items = new SimpleXMLElement($xml_response); 
foreach($items as $item){
        //in here I check the presence of the object properties
    }

有更好的方法吗?问题是xml结构有时会改变顺序,所以我希望能够直接转到xml的特定部分。

1 个答案:

答案 0 :(得分:1)

使用XPath这种事情非常容易,并且很方便SimpleXML has an xpath function内置了它! XPath允许您根据其祖先,后代,属性,值等选择图中的节点。

以下是使用SimpleXML的xpath函数从XML中提取数据的示例。请注意,我向您发布的示例添加了一个额外的父元素,以便XML验证。

$sxo = new SimpleXMLElement($xml);
# this selects all 'error' elements with parent 'appdata', which has parent 'app'
$error = $sxo->xpath('//app/appdata/error');

if ($error) {
    # go through the error elements...
    while(list( , $node) = each($error)) {
        # get the error details
        echo "Found an error!" . PHP_EOL;
        echo $node->Details->ErrorCode 
        . ", severity " . $node->Details->ErrorSeverity 
        . ": " . $node->Details->ErrorDescription . PHP_EOL;
    }
}

输出:

Found an error!
101, severity 3: Invalid Username and Password

这是另一个例子 - 我稍微编辑了XML摘录,以便更好地显示结果:

// edited <items> section of the XML you posted:
<items>
    <item>Item One
    </item>
    <item>Item Two
    </item>
</items>

# this selects all 'item' elements under appdata/items:
$items = $sxo->xpath('//appdata/items/item');
foreach ($items as $i) {
    echo "Found item; value: " . $i . PHP_EOL;
}

输出:

Found item; value: Item One
Found item; value: Item Two

SimpleXML XPath文档中有更多信息,并尝试zvon.org XPath tutorials - 它们为XPath 1.0语法提供了良好的基础。