XPath est rarement utilisé par nous maintenant parce que JSON est très populaire maintenant. Cependant, à l'ère lorsque XML était un format d'échange de données, XPath a joué une position très importante lorsque nous avons accédé au hasard sur de grandes structures de documents XML. Peut-être que de nombreuses personnes n'ont pas remarqué que l'interface spécifiée par Dom Level 3 XPATH a été mise en œuvre par Firefox, Safari, Chrome et Opera. L'interface centrale qu'ils implémentent est XPathevaluator, qui contient certaines méthodes qui peuvent fonctionner avec les expressions XPath. La méthode la plus importante est Evaluate (), qui peut accepter cinq paramètres 1.xpath String de requête 2. Indiquez quel nœud la chaîne de requête XPATH doit commencer à partir de 3. Analyser de l'espace de noms (introduit plus tard) 4. Résultat renvoyé Type 5.
Il existe principalement 10 types de retour différents. Chacun représente une constante de l'objet XPathResult.
Après tant d'introduction, comment devrions-nous utiliser ces API pour fonctionner?
Les informations renvoyées par la fonction Evaluate () dépend entièrement du type de résultat demandé.
Afin d'exécuter la requête XPath, vous devez utiliser l'objet XPathevaluator. Vous pouvez générer un nouvel objet ou utiliser l'objet intégré. Si vous générez un nouvel objet, vous devez initialiser le xpathevaluator.
var évaluator = new xpathevaluator (); // Obtenez le premier DIV VAR RESULT = EVCUATOR.EVALUÉ ("// div", document.DocumentElement, NULL, XPATHRESULT.FIRST_ORDED_NODE_TYPE, NULL); alert ("First Div Id est" + result.singLenodevalue.id);Dans Firefox, Safari, Chrome et Opera, toutes les instances de documents implémentent l'interface Xpathevaluator. De cette façon, si une requête est exécutée dans une page HTML, nous pouvons utiliser Document.EValuate (). Si le document XML est obtenu via XMLHTTPREQUEST ou d'autres mécanismes, la méthode Evaluate () peut également être utilisée, par exemple:
// Get First Div Var result = Document.EValuate ("// div", document.DocumentElement, null, xpathResult.First_OrderEd_Node_Type, null); alert ("First Div Id est" + result.singLenodevalue.id);Voici deux façons de retourner plusieurs nœuds, jetons un coup d'œil aux exemples d'abord:
// Get All Divs - Iterator Style var result = Document.Evaluate ("// div", document.DocumentElement, null, xpathResult.Ordered_Node_iterator_Type, null); if (result) {var node = result.iterateNext (); while (node) {alert (node.id); node = node.iterateNext (); }} // Get All Divs - Snapshot Style var result = Document.evaluate ("// div", document.DocumentElement, NULL, xpathResult.Ordered_Node_Snapshot_Type, NULL); if (result) {for (var i = 0, len = result.snapshotLength; i <len; i ++) {alert (result.snapshoTitem (i) .id); }}Espace de noms
Si vous utilisez simplement XPath pour interroger dans des documents HTML, le paramètre d'analyse de l'espace de noms dans EVALUate () est généralement nul. Si vous avez tendance à utiliser XPath pour interroger dans des documents XML contenant l'espace de noms, vous devez apprendre à créer et à utiliser l'analyseur d'espace de noms.
En plus de l'espace de noms par défaut, chaque URI de l'espace de noms est mappé à un préfixe spécifié. Chaque résolveur d'espace de noms est utilisé pour cartographier le préfixe de l'espace de noms et l'URI de l'espace de noms pour le moteur XPATH. Il existe deux façons de générer un résolveur d'espace de noms. Le premier est le suivant: Créez une méthode qui accepte un préfixe d'espace de noms en tant que paramètre, puis renvoie l'URL correspondante, comme suit:
Fonction Resolver (Prefix) {Switch (Prefix) {case "Wrox": return "http://www.wrox.com/"; cas "ncz": return "http://www.nczonline.net/"; Par défaut: renvoyez "http://www.yahoo.com/"; }}Le deuxième type utilise un nœud contenant des informations d'espace de noms pour générer un résolveur d'espace de noms.
<livres xmlns: wrox = "http://www.wrox.com/" xmlns = "http://www.amazon.com/"> <wrox: book> javascript professionnel </ book> </ books>
L'élément <books> contient toutes les informations d'espace de noms. Vous pouvez transmettre la référence à ce nœud à la méthode CreenTenSoVler () de l'objet XPathevaluator, puis vous pouvez automatiquement obtenir un résolveur d'espace de noms.
comme:
var évaluator = new xpathevaluator (); var résolver = evaluator.CreatePrensolver (xmLDoc.DocumentElement);
En utilisant l'une des méthodes ci-dessus, il est facile de s'interroger dans un document XML contenant l'espace de noms.
var évaluator = new xpathevaluator (); var résolver = evaluator.CreatePrensolver (xmLDoc.DocumentElement); var result = evaluator.evaluate ("wrox: book", xmlDoc.DocumentElement, Resolver, xpathResult.First_OrderD_Node_Type, null); if (result) {alert (result.singLenodevalue.firstchild.nodevalue); }Remarque: Si vous exécutez une requête dans un document XML contenant un espace de noms et ne fournissez pas d'analyseur d'espace de noms, une erreur se produira.
Prise en charge de XPath dans IE Browser
IE8 n'a pas encore implémenté l'interface définie dans DOM niveau 3 XPATH, mais il a également un certain support pour XPATH. La fonction XPATH dans IE est principalement disponible pour les documents XML et n'est pas disponible pour les objets de document.
Comment générer des documents XML dans IE:
fonction Createdocument () {if (typeof arguments.callee.activexString! = "String") {var versions = ["msxml2.domDocument.6.0", "msxml2.domDocument.3.0", "msxml2.domDocument"]; for (var i = 0, len = versions.length; i <len; i ++) {try {var xmldom = new activeXObject (versions [i]); arguments.callee.activexString = versions [i]; retour xmldom; } catch (ex) {// skip}}} return new activeXObject (arguments.callee.activexstring); }Après avoir généré l'objet Document, vous pouvez utiliser la méthode LoadXml () pour charger le contenu:
var xmldoc = créationDument (); xmlDoc.loadXml ("");La deuxième méthode génère un objet XML via l'objet XMLHTTReQuest.
var xhr = new xmlHttpRequest (), xmLDoc; xhr.open ("get", "data.xml", true); xhr.onreadystateChange = function () {if (xhr.readystate == 4) {if (xhr.status> = 200 && xhr.status <300) {xmldoc = xhr.Responsexml; }}; xhr.send (null);La troisième méthode consiste à utiliser la balise <XML>. Microsoft appelle cette méthode XML Data Island, comme suit:
<xml id = "myxml" src = "data.xml"> </ xml>
Alors:
var xmldoc = document.getElementById ("myxml"). xMLDocument;Support XPath:
Il existe deux méthodes intégrées pour prendre en charge XPATH dans des objets de document XML dans IE:
SELECTSingLenode () et SelectNodes (), chaque méthode accepte une expression XPath en tant que paramètre, puis remet respectivement le premier nœud correspondant et tous les nœuds correspondants.
Prise en charge de l'espace de noms:
pour
<livres xmlns: wrox = "http://www.wrox.com/" xmlns = "http://www.amazon.com/"> <wrox: book> javascript professionnel </ book>
</books> Pour ce document XML, nous devons utiliser la méthode suivante pour interroger, c'est-à-dire d'utiliser d'abord SetProperty () pour définir l'espace de noms du document XML.
xmldoc.setProperty ("SELECTIONNAMESSPACES", "XMLNS: WROX = 'http: //www.wrox.com/' xmlns = 'http: //www.amazon.com/' '"); var book = xmldoc.DocumentElement.SelectSlenode ("wrox: book");