Variables Simplexml从变量获取路径

Variables Simplexml从变量获取路径,variables,path,simplexml,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 co

有没有办法将路径作为变量传递给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
您需要的是,更具体地说是SimpleXML。与使用PHP的
->
运算符进行遍历不同,您可以使用XPath的
/
运算符进行遍历,但除此之外,可以完全达到您想要的效果:

$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的基础上; 您在网上看到的XPath2.0示例可能不起作用
  • XPath 1.0没有“默认名称空间”的概念,SimpleXML不会自动注册名称空间前缀以在XPath中使用,因此如果您使用名称空间,则需要使用
    • 您需要的是,更具体地说,是SimpleXML。与使用PHP的
      ->
      运算符进行遍历不同,您可以使用XPath的
      /
      运算符进行遍历,但除此之外,可以完全达到您想要的效果:

      $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的基础上; 您在网上看到的XPath2.0示例可能不起作用
      • XPath 1.0没有“默认名称空间”的概念,SimpleXML不会自动注册名称空间前缀以在XPath中使用,因此如果您使用名称空间,则需要使用