2010-08-29 12 views
5

J'essaie de trouver un noeud xml avec une requête xpath. mais je ne peux pas le faire fonctionner. Dans firefox, le résultat est toujours "indéfini" et chrome renvoie un code d'erreur.xpath avec le document dom

<script type="text/javascript"> 

var xmlString = '<form><name>test</name></form>'; 
var doc = new DOMParser().parseFromString(xmlString,'text/xml'); 

var result = doc.evaluate('/form/name', doc, 
          null, XPathResult.ANY_TYPE, null); 

alert(result.stringValue); 

</script> 

Quel est le problème avec ce code?

+0

Try '// forme/nom' –

Répondre

5

Je ne sais pas pourquoi avez-vous cette erreur, mais vous pouvez changer XPathResult.ANY_TYPE à XPathResult.STRING_TYPE et fonctionne (testé dans firefox 3.6).

Voir:

var xmlString = '<form><name>test</name></form>'; 
var doc = new DOMParser().parseFromString(xmlString,'text/xml'); 
var result = doc.evaluate('/form/name', doc, null, XPathResult.STRING_TYPE, null); 
alert(result.stringValue); // returns 'test' 

Voir en jsfiddle.


DÉTAILS:

Le 4ème paramètre de la méthode evaluate est un entier où vous spécifiez ce type de résultat avez-vous besoin (reference). Il y a beaucoup types, en tant qu'entier, chaîne et n'importe quel type. Cette méthode renvoie un XPathResult, qui possède de nombreuses propriétés.

Vous devez faire correspondre la propriété (numberValue, stringValue) avec la propriété utilisée dans evaluate. Je ne comprends pas pourquoi any type ne fonctionnait pas avec string value.

2

XPathResult.ANY_TYPE retournerait un ensemble de nœuds pour l'expression xpath /form/name, donc result.stringValue aurait du mal à convertir un ensemble de nœuds en chaîne. Dans ce cas, vous pouvez utiliser result.iterateNext().textContent

Cependant, une expression comme count(/form/name) renverrait une valeur numérique lorsqu'il est utilisé avec XPathResult.ANY_TYPE et vous pouvez utiliser result.numberValue pour récupérer le numéro dans ce cas.

Quelques explications plus détaillées à https://developer.mozilla.org/en/DOM/document.evaluate#Result_types