XPath是使用路径表达式来获取XML文档的节点和节点集。感觉跟正则表达式很相像。首先还是看代码吧,这样能保证我的代码能够正常执行。
首先需要创建一个页面或者一个xml文件。为了访问,我是创建了一个正常的页面。
然后需要创建另一个界面,来访问这个界面,访问方法,请见获得其他网页内容。
但请注意下面的方法传入的参数必须是XMLDocument的对象。如果是通过类似XMLHttpRequest的方式获得,可以获得responseText或responseXML的方式获得内容。但如果是responseText,结果就是字符串,这时候需要将字符串转换成XMLDocument的对象。
///获得接收到的网页数据的特定内容
///XMLDocumentObj: xmlDocument对象
///path: 查询的XPath路径
///disposeEveryNodeFunction:处理每个查询出的节点的函数,参数为每个查询出的节点
function getSpecialContent(XMLDocumentObj, path, disposeEveryNodeFunction) {
if (window.ActiveXObject) {
// code for IE
XMLDocumentObj.setProperty("SelectionLanguage", "XPath");
var nodes = XMLDocumentObj.selectNodes(path);
for (i = 0; i < nodes.length; i++) {
disposeEveryNodeFunction(nodes[i]);
}
} else if (document.implementation && document.implementation.createDocument) {
// code for Mozilla, Firefox, Opera, etc.
var nodes = XMLDocumentObj.evaluate(path, XMLDocumentObj, null, XPathResult.ANY_TYPE, null);
var result = nodes.iterateNext();
while (result) {
disposeEveryNodeFunction(result);
result = nodes.iterateNext();
}
}
}
//调用
getSpecialContent(xmlDocumentObj, "//h1[@id='productMainName']", function (node) {
if (node.childNodes.length > 0) {
document.write(node.childNodes[0].nodeValue);
document.write("<br>");
}
});
然后,我们来看看语法吧,嘻嘻。
nodename | 选取此节点的所有子节点。 |
/ | 从根节点选取。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点。 |
.. | 选取当前节点的父节点。 |
@ | 选取属性。 |
:: | 步 |
/a/book[1] | 属于 a子元素的第一个 book 元素。 |
/a/book[last()] | 属于 a子元素的最后一个 book 元素。 |
/a/book[position()<3] | 最前面的两个属于 a元素的子元素的 book 元素。 |
//book[@lang] | 选取所有名为 lang 的属性的 book元素。 |
//book[@lang='eng'] | 选取所有值为 eng 的 lang 属性的 book 元素。 |
//book[price>1] | 选取所有的 price 元素的值大于 1 的 book 元素。 |
attribute::lang | 选取当前节点的 lang 属性。 |
* | 匹配任何元素节点。 |
@* | 匹配任何属性节点。 |
node() | 匹配所有子节点。 |
text() | 匹配所有文本子节点。 |
| | 计算两个节点集 |
+ - * = != < <= > >= | 加法 减法 乘法 等于 不等于 小于 小于或等于 大于 大于或等于 |
div | 除法 |
or | 或 |
and | 与 |
mod | 计算除法的余数 |
查到一个元素后,可以根据当前元素为轴查看相关,参数如下
ancestor | 所有先辈(父、祖父等)。 |
ancestor-or-self | 所有先辈(父、祖父等)以及当前节点本身。 |
attribute | 所有属性。 |
child | 所有子元素。 |
descendant | 所有后代元素。 |
descendant-or-self | 所有后代元素以及当前节点本身。 |
following | 文档中当前节点的结束标签之后的所有节点。 |
namespace | 当前节点的所有命名空间节点。 |
parent | 父节点。 |
preceding | 文档中当前节点的开始标签之前的所有节点。 |
preceding-sibling | 当前节点之前的所有同级节点。 |
self | 当前节点。 |
除上述内容外,还有一些其它函数,详细参见:http://www.w3school.com.cn/xpath/xpath_functions.asp。