Simplexml从变量获取路径

时间:2015-06-08 20:28:59

标签: variables path simplexml

有没有办法将路径作为变量传递给simplexml节点? 这就是我试过的:

//set the path to the node in a variable
$comp = 'component->structuredBody->component';

echo count($xml->component->structuredBody->component); //=== 13
echo count($xml->$comp); //===0
echo count($xml->{$comp});//===0

1 个答案:

答案 0 :(得分:0)

您需要的是XPath,更具体地说是SimpleXML' xpath() method。您可以使用XPath的->运算符遍历,而不是遍历使用PHP的/运算符,否则,可以实现您想要的效果:

$comp = 'component[1]/structuredBody[1]/component';
echo count( $xml->xpath($comp) );

您可能认为这可以简化为'component/structuredBody/component',但是会找到与表达式匹配的所有可能路径 - 即如果有多个structuredBody元素,则将搜索所有这些。这可能实际上很有用,但它不等同于$xml->component->structuredBody->component,它实际上是$xml->component[0]->structuredBody[0]->component的简写。

有几点需要注意:

  • 与大多数使用SimpleXML的操作不同,结果是一个数组,而不是另一个SimpleXML对象(将其视为一组搜索结果)。因此,在将元素0作为对象访问之前,检查它是否为空是至关重要的。
  • 正如您在上面的示例中所看到的,XPath从1开始计数,而不是0.我不知道为什么,但它之前已经把我抓了出来,所以我想我会警告你
  • 库SimpleXML仅支持XPath 1.0; 您在线查看XPath 2.0的示例可能无效。
  • XPath 1.0没有"默认命名空间"的概念,并且SimpleXML不会自动注册用于XPath的名称空间前缀,所以如果你正在使用命名空间,你需要使用registerXPathNamespace()