Variables Simplexml从变量获取路径
有没有办法将路径作为变量传递给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
//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中使用,因此如果您使用名称空间,则需要使用