2011-02-28 19 views
6

Soy nuevo en el mundo de XPath. Quiero adoptar un enfoque XML para impulsar mi sitio web de cartera simple en lugar de una base de datos, que en este caso sería superfluo ya que el único elemento de la base de datos serían los proyectos mismos.Usar Xpath para buscar nodos XML con un elemento hijo específico

he sido autor de un archivo XML con la siguiente estructura:

<?xml version="1.0" encoding="UTF-8" ?> 
<projects> 
    <project> 
     <title>A-Merchandise</title> 
     <slug>a-merchandise</slug> 
     <projectType>E-commerce</projectType> 
     <launchDate>2007-08-01</launchDate> 
    </project> 
    ... 

ahora, puedo analizar esta bien archivo XML con PHP para obtener una descripción perfil, pero ¿cómo hago para proyectos de filtro con XPath? Por ejemplo, ¿cómo obtengo todos los nodos project que tienen un nodo secundario projectType con el valor e-commerce?

Normalmente, me gustaría ejecutar una consulta SQL como:

SELECT * FROM `projects` WHERE `category` = 'e-commerce'; 

¿Cuál sería el equivalente XPath? ¿Mi archivo XML está en la estructura correcta para acomodar este filtrado?

Cualquier puntero sería genial. Gracias por adelantado.

+0

Tal vez no relacionada con la pregunta, pero a su propósito, han considerado el uso de SQLite? El motor de la base de datos se inicializa en el mismo espacio de proceso ya que la aplicación y los archivos de la base de datos se almacenan en un formato "* .db". Sqlite tiene enlaces PHP y puede enviar sentencias SQL como cualquier otro motor de base de datos. Revisa este enlace: –

+0

@de costo - Me encanta SQLite tanto como el siguiente tipo, pero completamente fuera de tema ... ¿Cómo sabes que no está usando sqlite ahora? –

+0

@Byron - Sugerido como una opción para el propósito del autor de almacenar archivos. En mi opinión, no debería haber necesidad de archivos XML para los que tenga archivos .db para almacenar información. –

Respuesta

6

teniendo en cuenta el nombre del archivo XML es foo.xml y está en mismo directorio de la barra.php que tiene contenido

$projects = simpleXMLElement('foo.xml',null,true); 

$ecomProjects = $projects->xpath('project[projectType="E-commerce"]'); 

foreach($ecomProjects as $ecomProject) 
{ 
echo $ecomProject; // or do whatever with it 
} 
2

Hueso en xpath, es muy útil. Aunque no me gustan los w3cshools en general, sus xpath docs son bastante buenos.

$doc = new DOMDocument(); 
$xpath = new DOMXpath($doc); 

foreach ($xpath->query("/projects/project") as $node) 
{ 
    if ($node->textContent == "e-commerce") 
    { 
    // this node is the one you want. 
    } 
} 

o usando puro XPath

foreach ($xpath->query("/projects/project[projectType = 'e-commerce']") as $node) 
    { 
     // grab the $node 
    } 

Algunos indicadores

Para seleccionar un nodo en cualquier parte del prefijo doc con doble barras es decir //nodeYouWant. Para seleccionar un atributo, use @, es decir, /nodeName[@attribute='attributeValue'] sintaxis.

+0

No hay p/1 función 'contains()' en XPath ... –

+0

@Alejandro - correcto, actualizado. –

0

W3schools es un buen lugar para comenzar.

que probablemente cambiar ProjectType en un atributo del proyecto y luego seleccione la siguiente manera:

//project[@projectType ='e-commerce'] 
2

Puede utilizar los contribuyentes XPath, así:

//project[projectType='E-commerce'] 

En la documentación de XPath (http://www.w3.org/TR/xpath/#predicates), no es este ejemplo:

chapter[title="Introduction"] selecciona los chapter hijos del nodo contexto que tienen uno o más title niños con string-value igual a Introduction

+0

No es necesario iniciar el operador '//' cuando el esquema es conocido. –

+0

+1 Para cotizar las especificaciones. –

7

Creo desea que esta:

/projects/project[projectType="e-commerce"] 

[] El filtro selecciona todos los elementos bajo projectprojects que tienen un hijo con projectType valor "e-commerce"

También he encontrado this site para ser muy útil para jugar con consultas XPath y XSLT.

Más información: http://www.w3schools.com/xpath/xpath_syntax.asp

+0

+1 muy agradable .... –

+0

+1 Respuesta correcta. –

Cuestiones relacionadas