Есть ли способ получить конкретный элемент с SimpleXML?
Например, я хотел бы получить заголовок элемента с идентификатором, установленным в 12437, с помощью этого примера xml:
<items> <item> <title>blah blah 43534</title> <id>43534</id> </item> <item> <title>blah blah 12437</title> <id>12437</id> </item> <item> <title>blah blah 7868</title> <id>7868</id> </item> </items>
Вот два простых способа сделать то, что вы хотите, каждый из них выполняет итерацию с каждым элементом следующим образом:
<?php $str = <<<XML <items> <item> <title>blah blah 43534</title> <id>43534</id> </item> <item> <title>blah blah 12437</title> <id>12437</id> </item> <item> <title>blah blah 7868</title> <id>7868</id> </item> </items> XML; $data = new SimpleXMLElement($str); foreach ($data->item as $item) { if ($item->id == 12437) { echo "ID: " . $item->id . "\n"; echo "Title: " . $item->title . "\n"; } }
Live DEMO.
Другой будет использовать XPath, чтобы точно указать точные данные, которые вы хотите:
<?php $str = <<<XML <items> <item> <title>blah blah 43534</title> <id>43534</id> </item> <item> <title>blah blah 12437</title> <id>12437</id> </item> <item> <title>blah blah 7868</title> <id>7868</id> </item> </items> XML; $data = new SimpleXMLElement($str); // Here we find the element id = 12437 and get it's parent $nodes = $data->xpath('//items/item/id[.="12437"]/parent::*'); $result = $nodes[0]; echo "ID: " . $result->id . "\n"; echo "Title: " . $result->title . "\n";
Live DEMO.
Вы хотите использовать Xpath для этого. Это в основном то же самое, что и в SimpleXML: выбор элементов, которые имеют определенное значение атрибута, но в вашем случае вы не решаете значение атрибута, а значение элемента.
Однако в Xpath для обоих элементов, которые вы ищете, является parent.So формулировка выражения 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>
со значением "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, которые помогут вам найти то, что вы ищете.