您想为此使用 Xpath。它与SimpleXML中概述的基本完全相同:选择具有特定属性值的元素,但在您的情况下,您不是在决定属性值,而是在元素值上。
但是在 Xpath 中,您要查找的两个元素都是父元素。因此,制定 xpath 表达式有点简单:
// Here we find the item element that has the child <id> element
// with node-value "12437".
list($result) = $data->xpath('(//items/item[id = "12437"])[1]');
$result->asXML('php://output');
输出(美化):
<item>
<title>title of 12437</title>
<id>12437</id>
</item>
所以让我们再次看看这个 xpath 查询的核心:
//items/item[id = "12437"]
它被写成:选择作为<item>
任何元素的子元素的所有元素,这些<items>
元素本身具有以<id>
value命名的子元素"12437"
。
现在有了周围缺少的东西:
(//items/item[id = "12437"])[1]
周围的括号说:从所有这些<item>
元素中,只选择第一个。根据您的结构,这可能是必要的,也可能不是必要的。
所以这里是完整的使用示例和在线演示:
<?php
/**
* php simplexml get a specific item based on the value of a field
* @lin https://stackoverflow.com/q/17537909/367456
*/
$str = <<<XML
<items>
<item>
<title>title of 43534</title>
<id>43534</id>
</item>
<item>
<title>title of 12437</title>
<id>12437</id>
</item>
<item>
<title>title of 7868</title>
<id>7868</id>
</item>
</items>
XML;
$data = new SimpleXMLElement($str);
// Here we find the item element that has the child <id> element
// with node-value "12437".
list($result) = $data->xpath('(//items/item[id = "12437"])[1]');
$result->asXML('php://output');
因此,您在问题标题中所说的字段在本书中是子元素。在搜索更复杂的 xpath 查询时请记住这一点,这些查询可以为您提供所需的内容。