在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的特定部分。
答案 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语法提供了良好的基础。