O XPath raramente é usado por nós agora porque o JSON é muito popular agora. No entanto, na época em que o XML era um formato de troca de dados, o XPath jogou uma posição muito importante quando acessamos aleatoriamente grandes estruturas de documentos XML. Talvez muitas pessoas não tenham notado que a interface especificada pelo DOM Nível 3 XPath foi implementada pelo Firefox, Safari, Chrome e Opera. A interface principal que eles implementam é o XPathEvaluator, que contém alguns métodos que podem funcionar com expressões XPath. O método mais importante é avaliar (), que pode aceitar cinco parâmetros 1.xpath Query String 2. Indique qual nó a string de consulta XPath deve começar a partir de 3. Analisador de namespace (introduzido posteriormente) 4. Resultado retornado Tipo 5. O resultado retornado deve ser adicionado a esse objeto (raramente usado, porque o resultado é retornado principalmente por avaliação ()).
Existem principalmente 10 tipos de retorno diferentes. Cada um representa uma constante do objeto XPathResult.
Depois de tanta introdução, como devemos usar essas APIs para operar?
As informações retornadas pela função avaliar () dependem inteiramente do tipo de resultado solicitado.
Para executar a consulta XPath, você precisa usar o objeto XPathEvaluator. Você pode gerar um novo objeto ou usar o objeto interno. Se você gerar um novo objeto, precisará inicializar o XPathEvaluator.
var avaliador = new XPathEvaluator (); // obtenha o primeiro div var resultado = avaliador.evaluate ("// div", document.documentElement, null, xpathresult.first_ordered_node_type, null); alert ("primeiro Div ID é" + resultado.singlenOnodEvalue.id);No Firefox, Safari, Chrome e Opera, todas as instâncias de documentos implementam a interface XPathEvaluator. Dessa forma, se uma consulta for executada em uma página HTML, podemos usar o document.evaluate (). Se o documento XML for obtido através do XMLHTTPREQUEST ou outros mecanismos, o método avaliar () também poderá ser usado, por exemplo:
// obtém primeiro div var resultado = document.Evaluate ("// div", document.documentElement, null, xpathResult.first_ordered_node_type, null); alert ("primeiro Div ID é" + resultado.singlenOnodEvalue.id);A seguir, são apresentadas duas maneiras de retornar vários nós, vamos dar uma olhada nos exemplos primeiro:
// obtenha todas as divs - estilo iterador var resultado = document.Evaluate ("// div", document.documentElement, null, xpathResult.ordered_node_iterator_type, null); if (resultado) {var node = resultado.iteratenext (); while (node) {alert (node.id); node = node.iterateNext (); }} // obtenha todos os divs - estilo instantâneo var resultado = document.evaluate ("// div", document.documentElement, null, xpathresult.ordered_node_snapshot_type, null); if (resultado) {for (var i = 0, len = resultado.snapshotLength; i <len; i ++) {alert (resultado.snapshotItem (i) .id); }}Espaço para nome
Se você apenas usar o XPath para consultar em documentos HTML, o parâmetro do analisador de namespace em avaliar () geralmente será nulo. Se você tende a usar o XPath para consultar em documentos XML contendo namespace, você deve aprender a criar e usar o namespace analiser.
Além do espaço para nome padrão, cada espaço de nome de nome é mapeado para um prefixo especificado. Cada resolvedor de namespace é usado para mapear o prefixo de namespace e o namespace URI para o mecanismo XPath. Existem duas maneiras de gerar um resolvedor de namespace. O primeiro é o seguinte: Crie um método que aceite um prefixo de namespace como um parâmetro e depois retorna o URL correspondente, como segue:
resolver função (prefixo) {switch (prefix) {case "wrox": return "http://www.wrox.com/"; case "ncz": retornar "http://www.nczonline.net/"; Padrão: retornar "http://www.yahoo.com/"; }}O segundo tipo usa um nó que contém informações de namespace para gerar um resolvedor de namespace.
<Livros xmlns: wrox = "http://www.wrox.com/" xmlns = "http://www.amazon.com/"> <Wrox: Book> JavaScript </Books> </ Books>
O elemento <Books> contém todas as informações de namespace. Você pode passar a referência a este nó para o método CreatensResovler () do objeto XPathEvaluator e, em seguida, pode obter automaticamente um resolvedor de namespace.
como:
var avaliador = new XPathEvaluator (); var resolver = avaliador.creatensResolver (xmldoc.documentElement);
Usando qualquer um dos métodos acima, é fácil consultar em um documento XML contendo o espaço para nome.
var avaliador = new XPathEvaluator (); var resolver = avaliador.creatensResolver (xmldoc.documentElement); var resultado = avaliador.Evaluate ("Wrox: Book", xmldoc.documentElement, resolver, xpathResult.first_ordered_node_type, null); if (resultado) {alert (resultado.singlenOdEvalue.firstchild.nodEvalue); }Nota: Se você executar uma consulta em um documento XML contendo um espaço para nome e não fornecer um analisador de namespace, ocorrerá um erro.
Apoio ao XPath no navegador do IE
O IE8 ainda não implementou a interface definida no DOM Nível 3 XPath, mas também possui certo suporte ao XPath. A função XPath no IE está disponível principalmente para documentos XML e não está disponível para objetos de documento.
Como gerar documentos XML no IE:
function criousocument () {if (typeof argumments.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 (versões [i]); argumentos.callee.activeXString = versões [i]; retornar xmldom; } catch (ex) {// skip}}} retorna new ActiveXObject (argumentos.callee.activeXString); }Depois de gerar o objeto do documento, você pode usar o método loadxml () para carregar o conteúdo:
var xmldoc = CreateDocument (); xmldoc.loadxml ("");O segundo método gera um objeto XML através do objeto XMLHTTRECEEST.
var xhr = novo 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 (nulo);O terceiro método é usar a tag <xml>. A Microsoft chama esse método XML Data Island, como segue:
<xml id = "myxml" src = "data.xml"> </xml>
Então:
var xmldoc = document.getElementById ("myxml"). xmldocument;Suporte XPath:
Existem dois métodos internos para apoiar o XPath em objetos de documentos XML no IE:
SelectSingleNode () e SelectNodes (), cada método aceita uma expressão XPath como um parâmetro e depois coloca de volta o primeiro nó correspondente e todos os nós correspondentes, respectivamente.
Suporte para namespace:
para
<Livros xmlns: wrox = "http://www.wrox.com/" xmlns = "http://www.amazon.com/"> <Wrox: Book> JavaScript profissional </ Book>
</books> Para este documento XML, devemos usar o seguinte método para consultar, ou seja, use primeiro setProperty () para definir o espaço para nome do documento XML.
xmldoc.setProperty ("SelectionNamesPaces", "xmlns: wrox = 'http: //www.wrox.com/' xmlns = 'http: //www.amazon.com/'"); var book = xmldoc.documentElement.selectlennode ("wrlot = xmldoc.documentElement.selectlenode" ")