2011-01-19 2 views
13

Я пытаюсь получить доступ к содержимому элемента на основе значения атрибута. С PHP SimpleXML. У меня есть следующая настройка XML:SimpleXML получить содержимое элемента на основе значения атрибута

<DocSum> 
    <Id>21242919</Id> 
    <Item Name="Author" Type="String">Nguyen T</Item> 
    <Item Name="Title" Type="String">[Hemoptysis and spontaneous rupture of a primary renal angiosarcoma: a case report.]</Item> 
</DocSum> 
<DocSum> 
    <Id>21242919</Id> 
    <Item Name="Author" Type="String">Oliveira GC</Item> 
    <Item Name="Title" Type="String">Disclosing ambiguous gene aliases by automatic literature profiling.</Item> 
</DocSum> 
<DocSum> 
    <Id>21242919</Id> 
    <Item Name="Author" Type="String">Vanderwall DE</Item> 
    <Item Name="Title" Type="String">Metformin and digestive disorders.</Item> 
</DocSum> 

Это книги. В этом случае я пытаюсь получить название. Что я до сих пор такова:

$xml = simplexml_load_file(url); 
$docs = $xml->DocSum; 
foreach($docs as $book){ 
     // Each book individual 
} 

Где комментировать, я пробовал много чего.

+0

@Gordon: Я думаю, что это спрашивает, что использовать, а не как его использовать. –

+0

@ Alejandro цитирует OP в этом вопросе «Я хочу выбрать узлы на основе даты», где date является атрибутом элемента. Боб спрашивает, как получить «содержимое элемента, основанное на значении атрибута». Для меня нет никакой разницы. – Gordon

+0

@Gordon: OP также написал * ", и я использую этот XQuery и XPath для выбора узлов" * и явно запрашиваю XPath и XQuery в заголовке. –

ответ

19

Этот XPath запрос на объект SimpleXML будет возвращать все DocSum узлы, которые имеют Item ребенка со значением «Автор» в Name и значение атрибута «Olivera GC» в текстовом узле:

$nodes = $xml->xpath('//DocSum[Item[@Name="Author" and .="Oliveira GC"]]'); 
$book = $nodes[0]; 
print_r($book); 
5

Ну, я подозреваю, что решение будет XPATH ...

Если вы пытаетесь получить название книги по ИО, вы бы использовать запрос:

$query = '//DocSum/Id[contains(., "21232919")]'; 

Если вы пытаетесь искать название книги:

$query = '//DocSum/Item[@Name="Title" AND contains(., "Metformin")]'; 

Тогда просто запустить его:

$xml = simplexml_load_file($url); 

$results = $xml->xpath($query); 
foreach ($results as $titleElement) { 
    $book = simplexml_import_dom(dom_import_simplexml($titleElement)->parentNode); 
    // Handle the book here 
} 

Я преобразование туда и обратно между SimpleXML и DOMDocument, так что, как представляется, только документально способ перемещения вверх по дереву ...

+1

На самом деле XPath поддерживается из коробки в SimpleXML, поэтому вам фактически не нужно преобразовывать в DOM или создавать объект DomXpath. См. Http://docs.php.net/manual/en/simplexmlelement.xpath.php –

+0

Спасибо @Josh, я отредактировал его (но мне все еще нужно преобразование для доступа к родительскому объекту) – ircmaxell

+0

Вы можете выбрать родителей просто с XPath. Проверьте [@scoffey] (http://stackoverflow.com/questions/4736417/simplexml-get-element-content-based-on-attribute-value/4736714#4736714) ответ. –

Смежные вопросы