2010-01-15 18 views
8

¿Qué es una forma de identificar de manera única todos los nodos DOM en un documento HTML? Para ilustrar lo que quiero decir, he aquí un ejemplo (ficticio):¿Cuál es la mejor manera de identificar de manera única un nodo DOM?

  • El guión X selecciona aleatoriamente un nodo DOM de document.html.
  • El script X debe indicar al script Y el nodo DOM que ha elegido.
  • ¿Cómo identifica el script X de forma única el nodo DOM que ha elegido para que el script Y sepa exactamente qué nodo está en document.html?

Estoy realmente interesado en cómo identificar de forma única el nodo DOM para que la secuencia de comandos Y pueda identificarlo y manipularlo. Preferiblemente, debería funcionar también con nodos de texto. Estaba pensando en XPath quizás, pero no estoy seguro de cómo generar un único XPath a cualquier nodo dado.

Respuesta

6

Usted debe ser capaz de determinar un único XPath trabajando hacia atrás desde el nodo al nodo raíz, y el seguimiento del nodo que está en y que entre hermanos es, de forma que se obtiene algo así como:

/a[1]/b[2]/c[101]/text() 

de modo que es la C nodo 101a bajo la segunda nodo B, etc. Como tal, que es un único camino y puede ser copiado alrededor con referencia al documento original

+0

¿Qué pasa si hay un script Z que también manipula el DOM? – tback

+0

Las implementaciones de Xpath están disponibles en la mayoría de los idiomas. En la línea de comandos, puede usar una herramienta de línea de comandos llamada xmlstarlet (solo Google) –

+0

¡Exactamente lo que estaba buscando! ¿Qué pasa si mi código se ve así:

hello dear world

. ¿Cómo podría identificar el nodo "mundo"? ¿Haría algo como esto?/div [0]/p [0]/texto [1]? –

0

Bueno, una expresión XPath que dé como resultado un solo nodo debe ser única. ¿Qué quiere decir con "cómo generar un XPath único para cualquier nodo dado"?

+0

Correcto, pero lo hago a la inversa: sé en qué nodo estoy pero no cómo llegar allí;) la respuesta de Brian parece bastante buena. –

0

posiciones niño ordinales a lo largo de XPath ejes. Los nodos están fuertemente ordenadas, y así diciendo:

niño 1 niño de 3 de 4 niños de infantil 5.

debe hacerlo.

1

Es posible que desee echar un vistazo a XPathGen https://github.com/amouat/XPathGen

Se va a crear un XPath única de la forma /node()[1]/node()[1] para un nodo DOM dado. Sin embargo, hay algunos problemas con XPath, a saber, los nodos de texto no fusionados y los nodos "prolog", que no se pueden identificar de manera exclusiva con XPath. Por ejemplo, si usted tiene el siguiente documento en el DOM:

<a>b</a> 

y añadir un nodo de texto para convertirse en:

<a>bc</a> 

El XPath para los nodos B y C será el mismo, pero de todas maneras tendrá Nodos DOM separados (a menos que llames a normalizar en el documento). Si necesita manejar esta situación, necesitará almacenar desplazamientos y longitudes para los nodos de texto.

Cuestiones relacionadas