2011-01-19 13 views
13

Estoy intentando acceder al contenido de un elemento en función del valor de un atributo. Con PHP SimpleXML. Tengo la siguiente configuración XML:SimpleXML obtener contenido de elemento basado en el valor de atributo

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

Estos son los libros. En este caso, estoy tratando de obtener el título. Lo que tengo hasta ahora es esto:

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

Donde el comentario es que probé muchas cosas.

+0

@Gordon: creo que esto es pedir lo que debe usar, no la forma de utilizarlo. –

+0

@Alejandro citando el OP en esa pregunta "Quiero seleccionar los nodos según la fecha" donde date es un atributo de un elemento. Bob pregunta cómo obtener el "contenido de un elemento basado en el valor de un atributo". No hay diferencia para mi – Gordon

+0

@Gordon: OP también escribió * "y estoy usando XQuery y XPath para seleccionar los nodos" * y solicito explícitamente XPath y XQuery en el título. –

Respuesta

19

Este XPath consulta en el objeto SimpleXML devolverá todos los nodos que tienen DocSum un niño Item con el valor "autor" en el Name atributo y el valor "Olivera GC" en el nodo de texto:

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

Bueno, sospecho que la solución será XPATH ...

Si usted está tratando de obtener el título de un libro escrito por el ello, tendrá que utilizar la consulta:

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

Si usted está tratando de buscar el título de un libro:

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

a continuación, sólo ejecutarlo:

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

estoy convirtiendo ida y vuelta entre simplexml y DOMDocument ya que parece ser la única manera documentada de atravesar el árbol ...

+1

En realidad, XPath se admite de fábrica en SimpleXML, por lo que no es necesario convertir a DOM o crear un objeto DomXpath. Consulte http://docs.php.net/manual/en/simplexmlelement.xpath.php –

+0

Gracias @Josh, lo he editado (pero igual necesito la conversión para acceder al padre) – ircmaxell

+0

Puede seleccionar solo los padres con XPath. Verifique la respuesta de [@scoffey] (http://stackoverflow.com/questions/4736417/simplexml-get-element-content-based-on-attribute-value/4736714#4736714). –

Cuestiones relacionadas