php - xml。是否可以在不循环遍历xml文件的所有数据的情况下访问特定的xml节点

时间:2015-01-13 07:30:36

标签: php xml xpath simplexml

像这样的Xml文件

<xml>

<Categories>
<OneSubcategory>

<Id>4</Id>
<CategoriesUrl>cars</CategoriesUrl>

<Id>5</Id>
<CategoriesUrl>staff-required</CategoriesUrl>

</OneSubcategory>
</Categories>

</xml>

希望获得<Id> <CategoriesUrl> cars

$xml = simplexml_load_file( filename.xml' );

现在我这样做

1)foreach($xml->children() as $subcategory){ if( trim($subcategory->OneSubcategory->CategoriesUrl) == 'cars' ){ $id = trim($subcategory->OneSubcategory->Id); } }

2)然后遍历所有文件

SELECT Id WHERE CategoriesUrl = 'cars'

是否可以在没有循环的情况下获取值,例如mysql $id = $xml->xpath('Categories/OneSubcategory/Id');

更新

基于此http://www.tuxradar.com/practicalphp/12/3/3#null

使用Id获取所有$id = $xml->xpath('Categories/OneSubcategory/Id[CategoriesUrl="cars"]');

的数组

尝试$id = $xml->xpath('Categories/OneSubcategory[CategoriesUrl="cars"]/Id'); 获取空数组

什么是错误的?

似乎这是一个解决方案

{{1}}

1 个答案:

答案 0 :(得分:1)

查询似乎已关闭,因为CategoriesUrlId是兄弟姐妹。如果您不想循环,则只需将索引显式设置为零即可获得第一个值。

$query = "//Id[following-sibling::CategoriesUrl[text() = 'cars']]";
$nodes = $xml->xpath($query);
if(count($nodes) > 0) { // if found
    // get one
    $id = $nodes[0];
    echo $id;

    // if you want to loop
    // foreach($nodes as $node) { // loop all results
    //  $id = (string) $node;
    //  echo $id;
    // }
}

如果您希望找到所有结果,那么只需使用foreach。