posts - 15,  comments - 8,  trackbacks - 0
在使用Dom4j解析xml文档时,我们很希望有一种类似正则表达式的东西来规范查询条件,而xpath正是这样一种很便利的规则.
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;

还有一个是获取某个节点下面里的所有第一级子节点,而不是所有的节点(包括子节点和孙节点).
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,可从网上下载.

<?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()35.00]   选择根元素bookstore的book子元素中那些拥有price子元素且值大于35的
/bookstore/book[price>35.00]/title 选择根元素bookstore的book子元素中那些拥有price子元素且值大于35的title子元素

通配符                        描述
*                        匹配所有元素
@*                       匹配所有属性节点
node()                   匹配任何类型的节点
示例
表达式                        描述
/bookstore/*             选择根元素bookstore的下的所有子元素
//*                      选择文档中所有元素
//title[@*]              选择所有拥有属性的title元素
posted on 2009-05-19 00:12 lvq810 阅读(595) 评论(0)  编辑  收藏 所属分类: Open Framekwork