2009-04-24 34 views
39

¿Cómo acceder a los comentarios dentro del documento XML utilizando XPath?Acceso a comentarios en XML con XPath

Por ejemplo:

<table> 
<length> 12 </length> 
<!--Some comment here--> 
</table> 

quiero acceder a la "Algunos comentarios aquí".

Gracias ...

EDIT: Estoy utilizando MSXML DOM ActiveX y el comentario de comandos() parece estar fallando ... ¿Alguna idea de por qué?

Respuesta

50

Con el camino

/foo/bar/comment() 

puede seleccionar todos los comentarios en el elemento/foo/bar. Puede depender de su idioma de elección, por supuesto. Pero en general, así es como lo haces. función

+0

Estoy usando MSXML DOM ActiveX y este comando parece estar fallando ... ¿Alguna idea de por qué? – Manoj

+0

No, no tengo idea de por qué. Pasaron más de 7 años desde la última vez que utilicé las bibliotecas MSXML ... –

+0

¿Seguro que su raíz de xpath está bien? Pruebe "// comment()" para asegurarse. – annakata

19

Uso comentario() por ejemplo: -

/table/length/following::comment()[1] 

selecciona el primer comentario que sigue el elemento de longitud.

Editar

Manoj pregunta en un comentario a esta respuesta por qué esto no está funcionando en MSXML. La razón será que estés usando MSXML3. Por defecto, MSXML3 no usa XPath como su lenguaje de selección, por defecto es un lenguaje mucho más débil (patrón XSL). Debe establecer XPath como el idioma de selección a través del método setProperty de DOMDocument. Por ejemplo (en JScript): -

var dom = new ActiveXObject("MSXML2.DOMDocument.3.0"); 
dom.setProperty("SelectionLanguage", "XPath"); 

Ahora el lenguaje XPath completo trabajarán en sus consultas (nota un cambio importante es predicados indexador se basan en 1 XPath mientras que eran 0 basada en el patrón de XSL).

+1

O simplemente:/table/comment() [1] – Tomalak

+0

Probablemente hay todo tipo de enfoques para este caso específico, pero esto fue lo más cercano que pude llegar a una solución más general de encontrar el comentario después de un elemento específico – AnthonyWJones

+1

Estoy usando MSXML DOM ActiveX y este comando parece estar fallando ... ¿Alguna idea de por qué? – Manoj

1

Tal vez esto coud ayudar, Este ejemplo quita Comentarios

XmlNodeList list = xmlDoc.SelectNodes("//comment()"); 
foreach(XmlNode node in list) 
node.ParentNode.RemoveChild(node); 

inclinó de aquí link text

+0

Probablemente recibirá un error si hay comentarios en la raíz, por lo que es posible que desee verificar ese nodo. ParentNode no es nulo. –

3

Basándose en los comentarios de la OP a respuestas publicadas (y mi curiosidad de por qué esta cosa simple no funcionaría), aquí está mi sugerencia:

Utilizando la expresión XPath sugerida por @Anthony, pude cargar con éxito el nodo de comentario con la siguiente función JS:

function SelectComment(s) 
{ 
    var xDoc = new ActiveXObject("MSXML2.DOMDocument.6.0"); 
    if (xDoc) 
    { 
    xDoc.loadXML(s); 
    var selNode = xDoc.selectSingleNode("/table/length/following::comment()[1]"); 
    if (selNode != null) 
     return selNode.text; 
    else 
     return ""; 
    } 
} 

invocación de la muestra:

SelectComment("<table><length> 12</length><!--Some comment here--></table>"); 

de salida:

"Some comment here" 

Notas:

a. Su versión MSXML puede variar. Por favor use apropiadamente.

b. Este tipo de código definitivamente no es recomendable porque funciona solo en IE.Sin embargo, dado que este es su requisito explícitamente establecido, he usado ActiveXObject.

c. No ha mencionado en sus comentarios lo que falla en las expresiones XPath sugeridas. Supongo que no está consultando la propiedad text del nodo recuperado. Tenga en cuenta que SelectSingleNode siempre devuelve IXmlNode y necesita consultar sus propiedades data o text.

Cuestiones relacionadas