我有以下XML:
<Root>
<personalData>
<userName>John Tom</userName>
<email>mail@example.com</email>
</personalData>
<profesionalData>
<job>engineer</job>
<jobId>16957</jobId>
</profesionalData>
</Root>
在我的调试器中执行:
$myObject->xpath('//Root/profesionalData')
我有:
: array =
0: object(SimpleXMLElement) =
job: string = engineer
jobId: string = 16957
我无法抓住jobId
16957
。
我该怎么办?
答案 0 :(得分:1)
$root = simplexml_load_file('file.xml');
$job_ids = $root->xpath('//profesionalData/jobId');
if (!$job_ids) {
die("Job IDs not found");
}
foreach ($job_ids as $id) {
// SimpleXmlElement implements __toString method, so
// you can fetch the vlaue by casting the object to string.
$id = (string)$id;
var_dump($id);
}
示例输出
string(5) "16957"
备注强>
您不需要在XPath表达式中指定Root
,如果您要获取所有profesionalData/jobId
标记,无论它们在文档中的位置,只需使用双斜杠( //
)表达。当您想要避免注册XML名称空间时,这种方法可能很方便。否则,您可以使用类似/Root/profesionalData/jobId
的严格表达式(来自根目录的路径)。顺便说一句,您当前的表达式(//Root/profesionalData/jobId
)会匹配文档中出现的/Root/profesionalData/jobId
,例如/x/y/z/Root/profesionalData/jobId
。
由于SimpleXmlElement::xpath
函数在成功时返回数组,或者在失败时返回FALSE
,因此如果它是非空数组,则应使用循环迭代该值。
SimpleXmlElement
实施__toString
方法。当对象出现在字符串上下文中时,将调用该方法。特别是,您可以cast将对象转换为字符串,以便获取节点的字符串内容。