2011-05-18 35 views
9

Estoy tratando de obtener un hijo de un PHP DOMDocument. Decir que tengo un documento DOM como esto:Cómo obtener un hijo de PHP DOMDocument por índice

<div> 
    <h1 ></h1> 
    <div id=2></div> 
    <div class="test"></div> 
... 
</div> 

Tengo un número de índice 3. Entonces necesito para obtener el elemento <div class="test"></div>. En la API DOMDocument, no hay un método como children(3). ¿Esta ahí? ¿Cómo puedo obtener un niño con un índice?

+0

es necesario utilizar getElementByTag ('div') y luego usar el getAttribute ('clase') y poner eso en si la condición para que coincida con class = 'prueba'. requiere un poco de RnD –

+0

* (relacionado) * [Mejores métodos para analizar HTML] (http://stackoverflow.com/questions/3577641/best-methods-to-parse-html/3577662#3577662) y [Pregunta Noob acerca de DOMDocument en PHP] (http://stackoverflow.com/questions/4979836/noob-question-about-domdocument-in-php/4983721#4983721) – Gordon

+0

posible duplicado de [¿Cómo obtener el primer nivel de elementos dom por Domdocument PHP? ] (http://stackoverflow.com/questions/5882433/how-get-first-level-of-domy-elements-by-domdocument-php) – Gordon

Respuesta

18

Usted puede use childNodes. Esta es una propiedad de un elemento DOM que contiene una NodeList que contiene todos los elementos del elemento. Idealmente, podría hacer $el->childNodes->item(2) (tenga en cuenta que está basado en 0, no en 1, por lo que 2 es el tercer elemento). Sin embargo, esto incluye nodos de texto. Por lo tanto, es difícil predecir qué número será tu nodo. Esta probablemente no es la mejor solución.

Puede ir con alexn's solution (getElementsByTagName('*')->item(2)), pero una vez más esto tiene sus inconvenientes. Si sus nodos tienen nodos secundarios, también se incluirán en la selección. Esto podría descartar tu cálculo.

Mi solución preferida sería usar XPath: probablemente sea la solución más estable y no particularmente difícil.

Deberá haber creado un objeto XPath con $xpath = new DOMXPath($document) en algún lugar, donde $document es su instancia de DOMDocument. Voy a asumir que $el es el nodo div padre, el "contexto" que estamos buscando en.

$node = $x->query('*', $el)->item(2); 

Tenga en cuenta que, una vez más, estamos usando un índice de 0 a base de encontrar qué elemento en la selección que es. Aquí, estamos buscando nodos secundarios del nivel superior div solamente, y * selecciona solo nodos de elementos, por lo que los cálculos con nodos de texto son innecesarios.

+0

+1 para XPath, esa es realmente la solución –

+0

hola, gracias por su respuesta. Intenté $ el-> childNode-> item (2). rayó todas las etiquetas html. También probé $ x-> query ('/ div/*', $ el) -> item (2); pero note que el nodo hijo no está fijo con div ... Necesito dinámicamente para obtener un nivel hijo por nivelar hacia abajo con un índice serial como 1 3 4 0. – bingjie2680

+0

@Yijie Sí, debería haber sido simplemente 'query ('*', $ el)'. Ver respuesta actualizada. – lonesomeday

4

Si usa DOMDocument puede usar getElementsByTagName('*') que devuelve una DomNodeList con todos los elementos en su documento. A continuación, puede invocar la función item que tiene un índice como parámetro:

$nodes = $dom->getElementsByTagName('*'); 
$targetNode = $nodes->item(3); 
+0

Hola, gracias por la respuesta, tu solución obtiene todo el elemento de todos los nodos descendientes. y todas las etiquetas html están recortadas. mi intención es hacer que un niño nivel por nivel con una serie de índices como 1 3 4 0. Espero que esto esté claro. – bingjie2680

1

probar esto

foreach($dom->getElementsByTagName('div') as $div) { 
     $class = $div->getAttribute('class'); 
    } 

que ahora podemos reconocer la clase o atributo id de ese div particular y hacer lo que nunca. esta no es la solución, pero te ayuda a encontrar los contenidos y atributos con todos los divs '. Espero eso ayude.

0

Prueba esto:

$dom->childNodes->item(3) 
Cuestiones relacionadas