javascript - 解析的 XML 文档中的 XPath 错误 (WrongDocumentError)

标签 javascript firefox xpath firefox-addon firefox-addon-sdk

我正在创建 Android 版 Firefox 扩展,但从 XMLHttpRequest 检索 XML 文档时遇到问题:我找不到选择节点的方法。我找到的更好的解决方案是这样的,但是在文档上使用xpath选择时出现此错误:

WrongDocumentError: Node cannot be used in a document other than the one in which it was created

这是我的代码:

var parser = Cc["@mozilla.org/xmlextras/domparser;1"].createInstance(Ci.nsIDOMParser); 
var parsedXml = parser.parseFromString(xmlhttp.responseText, "text/xml");    
var xpathExpression = "//td[contains(.,'Raw text')]/../td[2]/pre"; 

var res = window.content.document.evaluate(xpathExpression, parsedXml, null, window.XPathResult.STRING_TYPE , null);

如果我用下一行替换“评估”:

var res = parsedXml.selectSingleNode(xpathExpression);

然后我收到以下错误:

[JavaScript Error: "parsedXml.selectSingleNode is not a function" {file: "resource://gre/modules/addons/XPIProvider.jsm -> jar:file:///data/data/org.mozilla.fennec/files/mozilla/ggz9zzjr.default/extensions/qrReader@qrReader.xpi!/bootstrap.js" line: 61}]

最佳答案

嗯,异常的名称 WrongDocumentErrort 泄露了它。您尝试在不属于同一文档 .evaluate() 的 DOM (Document) 上调用 .evaluate()绑定(bind)到。

nsIDOMParser 实际上会返回一个新的 XMLDocument,它本身具有 .evaluate(),您必须使用它。

var parser = Cc["@mozilla.org/xmlextras/domparser;1"].
             createInstance(Ci.nsIDOMParser); 
var parsedDoc = parser.parseFromString(
  '<?xml version="1.0"?>\n<doc><elem>Raw text</elem></doc>',
  "text/xml");    
var xpathExpression = "//elem[contains(.,'Raw text')]"; 

var res = parsedDoc.evaluate(
  xpathExpression,
  parsedDoc,
  null,
  XPathResult.STRING_TYPE,
  null);
console.log(res, res.stringValue);

而不是使用nsIDOMParser,因为您的内容似乎无论如何都源自XHR,并且似乎是(X)HTML(由您的表达式指示),所以它可能是最好使用 XHR.responseType = "document" 来代替,它将使用 HTML 解析器从响应中解析 DOM。

var req = new XMLHttpRequest();
req.onload = function() {
  var doc = req.response;
  var h1 = doc.evaluate("//h1", doc, null, XPathResult.STRING_TYPE, null);
  console.log(h1.stringValue);

  // Alternative in some cases
  h1 = doc.querySelector("h1");
  console.log(h1.textContent);
};
req.open("GET", "http://example.org/");
req.responseType = "document"; // Parse as text/html
req.send();

关于javascript - 解析的 XML 文档中的 XPath 错误 (WrongDocumentError),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24166459/

相关文章:

javascript - 从 App 组件更改子元素的状态

javascript - Jquery 自动完成不附加

javascript - 使用 Meteor 返回 MongoDB 中具有单个字符串值的数组

javascript - document.execCommand 在 Firefox 和 IE 中不起作用

html - 设置 <a href =""> 为本地文件的正确方法

Python libxml2 : querying xml using xpath

sql - 从 SQL XML 中提取字段

c# - Asp.Net 中的 Flesch-Kincaid 可读性

javascript - 在 Firefox 和谷歌浏览器上复制到剪贴板

parsing - 如何修改 XPATH 解析器?