您的位置:首页 > 其它

在Dom4j中使用xpath

2008-02-26 16:30 232 查看
在使用Dom4j解析xml文档时,我们很希望有一种类似正则表达式的东西来规范查询条件,而xpath正是这样一种很便利的规则吧.

以下是本人用写的一个类,摘取部分代码;

Java代码



String xmlName = path + "/" + userName + ".xml";

// 定义需要返回的第一级菜单的名字集合

List firstNames = new ArrayList();

// Attribute的属性集合

List attrs = new ArrayList();

// 声明SAXReader

SAXReader saxReader = new SAXReader();

try {

Document doc = saxReader.read(xmlName);

// 获得所有grade=1的Element的text的值

String xpath = "/tree/item";

List list = doc.selectNodes(xpath);

Iterator it = list.iterator();

while (it.hasNext()) {

Element elt = (Element) it.next();

Attribute attr = elt.attribute("grade");

System.out.println(attr.getValue());

if (new Integer(attr.getValue()).intValue() == 1) {

attr = elt.attribute("text");

attrs.add(attr.getValue());

System.out.println(attr.getValue());

}

}

} catch (DocumentException e) {

e.printStackTrace();

}

return attrs;

String xmlName = path + "/" + userName + ".xml";
// 定义需要返回的第一级菜单的名字集合
List firstNames = new ArrayList();
// Attribute的属性集合
List attrs = new ArrayList();
// 声明SAXReader
SAXReader saxReader = new SAXReader();
try {
Document doc = saxReader.read(xmlName);
// 获得所有grade=1的Element的text的值
String xpath = "/tree/item";
List list = doc.selectNodes(xpath);
Iterator it = list.iterator();
while (it.hasNext()) {
Element elt = (Element) it.next();
Attribute attr = elt.attribute("grade");
System.out.println(attr.getValue());
if (new Integer(attr.getValue()).intValue() == 1) {
attr = elt.attribute("text");
attrs.add(attr.getValue());
System.out.println(attr.getValue());
}
}
} catch (DocumentException e) {
e.printStackTrace();
}
return attrs;


还有一个是获取某个节点下面里的所有第一级子节点,而不是所有的节点(包括子节点和孙节点).

Java代码



public static List getSecondMenuNames(String textName, String path,

String userName) {

String xmlName = path + "/" + userName + ".xml";

String name = textName;

// 定义需要返回的第二级菜单的名字集合

List firstNames = new ArrayList();

// Attribute的属性集合

List attrs = new ArrayList();

// 声明SAXReader

SAXReader saxReader = new SAXReader();

try {

Document doc = saxReader.read(xmlName);

// 这个xpath的意思是,获取text='系统管理'的一个Item下的所有Item的节点

String xpath = "//item[@text='" + name + "']/child::*";

List list = doc.selectNodes(xpath);

Iterator it = list.iterator();

while (it.hasNext()) {

Element elt = (Element) it.next();

Attribute attr = elt.attribute("grade");

System.out.println(attr.getValue());

attr = elt.attribute("text");

System.out.println(attr.getValue());

attrs.add(attr.getValue());

}

} catch (Exception e) {

e.printStackTrace();

}

return attrs;

}

public static List getSecondMenuNames(String textName, String path,
String userName) {
String xmlName = path + "/" + userName + ".xml";
String name = textName;
// 定义需要返回的第二级菜单的名字集合
List firstNames = new ArrayList();
// Attribute的属性集合
List attrs = new ArrayList();
// 声明SAXReader
SAXReader saxReader = new SAXReader();
try {
Document doc = saxReader.read(xmlName);
// 这个xpath的意思是,获取text='系统管理'的一个Item下的所有Item的节点
String xpath = "//item[@text='" + name + "']/child::*";
List list = doc.selectNodes(xpath);
Iterator it = list.iterator();
while (it.hasNext()) {
Element elt = (Element) it.next();
Attribute attr = elt.attribute("grade");
System.out.println(attr.getValue());
attr = elt.attribute("text");
System.out.println(attr.getValue());
attrs.add(attr.getValue());
}
} catch (Exception e) {
e.printStackTrace();
}
return attrs;
}


注意看其中的xpath的写法,正是因为有了xpath,我们才能如此简单灵活的对xml进行操作.

刚刚使用xpath的时候可能会报一个错误:Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/JaxenException

这时我们应该往CLASSPATH导入一个jar包,叫jaxen-1.1.1.jar,可从网上下载.

以下附上xpath的部分语法,具体可查看我的BOLG的链接,有一个叫xpath的.呵呵!

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book>

<title lang="eng">Harry Potter</title>

<price>29.99</price>

</book>

<book>

<title lang="eng">Learning XML</title>

<price>39.95</price>

</book>

</bookstore>

表达式 描述

节点名 选择所有该名称的节点集

/ 选择根节点

// 选择当前节点下的所有节点

. 选择当前节点

.. 选择父节点

@ 选择属性

示例

表达式 描述

bookstore 选择所有bookstore子节点

/bookstore 选择根节点bookstore

bookstore/book 在bookstore的子节点中选择所有名为book的节点

//book 选择xml文档中所有名为book的节点

bookstore//book 选择节点bookstore下的所有名为book为节点

//@lang 选择所有名为lang的属性

断言

在方括号中[],用来更进一步定位选择的元素

表达式 描述

/bookstore/book[1] 选择根元素bookstore的book子元素中的第一个

注意: IE5以上浏览器中第一个元素是0

/bookstore/book[last()] 选择根元素bookstore的book子元素中的最后一个

/bookstore/book[last()-1] 选择根元素bookstore的book子元素中的最后第二个

/bookstore/book[position()<3] 选择根元素bookstore的book子元素中的前两个

//title[@lang] 选择所有拥有属性lang的titile元素

//title[@lang='eng'] 选择所有属性值lang为eng的title元素

/bookstore/book[price>35.00] 选择根元素bookstore的book子元素中那些拥有price子元素且值大于35的

/bookstore/book[price>35.00]/title 选择根元素bookstore的book子元素中那些拥有price子元素且值大于35的title子元素

选择位置的节点

通配符 描述

* 匹配所有元素

@* 匹配所有属性节点

node() 匹配任何类型的节点

示例

表达式 描述

/bookstore/* 选择根元素bookstore的下的所有子元素

//* 选择文档中所有元素

//title[@*] 选择所有拥有属性的title元素

使用操作符“|”组合选择符合多个path的表达式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: