php simplexml получает определенный элемент на основе значения поля

Есть ли способ получить конкретный элемент с 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> 

Solutions Collecting From Web of "php simplexml получает определенный элемент на основе значения поля"

Вот два простых способа сделать то, что вы хотите, каждый из них выполняет итерацию с каждым элементом следующим образом:

 <?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, которые помогут вам найти то, что вы ищете.