2011-01-19 5 views
13

Sto provando ad accedere al contenuto di un elemento in base al valore di un attributo. Con PHP SimpleXML. Ho la seguente configurazione XML:SimpleXML ottiene il contenuto dell'elemento in base al valore dell'attributo

<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> 

Questi sono libri. In questo caso sto cercando di ottenere il titolo. Quello che ho finora è questo:

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

Dove il commento è provato un sacco di cose.

+0

@Gordon: credo che questo sta chiedendo cosa usare, non come usarlo. –

+0

@Alejandro citando l'OP in quella domanda "Voglio selezionare i nodi in base alla data" dove data è un attributo di un elemento. Bob chiede come ottenere il "contenuto di un elemento in base al valore di un attributo". Non c'è differenza per me. – Gordon

+0

@Gordon: OP ha anche scritto * "e sto usando questo XQuery e XPath per selezionare i nodi" * e chiedere esplicitamente XPath e XQuery nel titolo. –

risposta

19

Questo XPath interrogazione sull'oggetto SimpleXML restituirà tutti i nodi che hanno DocSum un Item bambino con valore di "Autore" nel Name attributo e il valore "Olivera GC" nel nodo di testo:

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

Beh, ho il sospetto che la soluzione sarà XPATH ...

Se si sta cercando di ottenere il titolo di un libro del id, devi usare la query:

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

Se stai cercando per cercare il titolo di un libro:

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

Poi basta eseguirlo:

$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 
} 

sto convertendo avanti e indietro tra SimpleXML e DOMDocument dato che sembra essere l'unico modo documentato di attraversare l'albero ...

+1

In realtà, XPath è supportato immediatamente in SimpleXML, quindi non è necessario convertirlo in DOM o creare un oggetto DomXpath. Vedi http://docs.php.net/manual/en/simplexmlelement.xpath.php –

+0

Grazie a @Josh, l'ho modificato (ma ho ancora bisogno della conversione per accedere al genitore) – ircmaxell

+0

Puoi selezionare solo i genitori con XPath. Controlla la risposta [@scoffey] (http://stackoverflow.com/questions/4736417/simplexml-get-element-content-based-on-attribute-value/4736714#4736714). –