`

使用DOM4J和xpath解析XML(二)

    博客分类:
  • xml
阅读更多
在使用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()35.00] 选择根元素bookstore的book子元素中那些拥有price子元素且值大于35的
/bookstore/book[price>35.00]/title 选择根元素bookstore的book子元素中那些拥有price子元素且值大于35的title子元素
选择位置的节点
通配符               描述
*             匹配所有元素
@*             匹配所有属性节点
node()             匹配任何类型的节点
示例
表达式               描述
/bookstore/*    选择根元素bookstore的下的所有子元素
//*             选择文档中所有元素
//title[@*]    选择所有拥有属性的title元素

所要用到的jar包
分享到:
评论

相关推荐

    使用dom4j和jaxen解析xml

    - **dom4j+jaxen操作XML**:首先使用dom4j解析XML,然后通过jaxen创建XPath对象并执行查询。查询结果可以是元素、属性或其他XML节点,根据需要进行进一步处理。 例如,以下代码展示了如何使用dom4j和jaxen解析XML...

    使用DOM4J和xpath解析XML(一)

    NULL 博文链接:https://bbsanwei.iteye.com/blog/266394

    Dom4j 、XPath解析Xml所需的jar包和dom4j API

    在Java编程中,解析XML文档通常需要借助库,如DOM4J和XPath。DOM4J是一个灵活且功能强大的开源Java XML API,它提供了XML的读取、写入、修改和遍历等功能。XPath则是W3C标准中的一个查询语言,用于在XML文档中查找...

    Dom4j结合XPath解析XML文件路径表达式

    本篇文章将深入探讨如何使用Dom4j,一个流行的Java库,结合XPath来解析XML文件中的路径表达式,同时阐述相对路径和绝对路径的匹配原则。 首先,我们要了解Dom4j库。Dom4j是一个灵活且高效的处理XML的Java库,它提供...

    dom4j 和xpath

    - 解析XML:DOM4J可以通过SAX或者DOM方式解析XML文档,构建出文档对象模型。 - 访问元素:使用Element类来代表XML元素,可以通过方法如getElementById、getElementsByTagname等获取元素。 - 处理属性:Attribute...

    xml+dom4j+xpath资料

    我们可以使用DOM4J和XPath找到所有年龄: ```java import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.XPath; // 解析XML文档 Document document = DocumentHelper.parseText...

    Demo4j和XPath解析XML的文件路径表达式(ZVON.org - X 路径教程)

    本教程将重点讨论如何使用Java库Demo4j与XPath一起工作,以解析XML文件中的路径表达式。 首先,我们需要理解XPath的基本概念。XPath使用路径表达式来选取XML文档中的节点,这些路径表达式类似于文件系统中的路径。...

    dom4j和xpath必备jar包

    例如,通过DOM4J解析XML文档,然后使用XPath表达式来快速定位到特定的元素或属性,从而进行读取或修改。这对于处理大型XML文档或者需要频繁查询XML数据的场景尤其有用。 在实际应用中,"dom4j和xpath必备jar包"通常...

    dom4j解析xml详解

    ### DOM4J解析XML详解 #### 一、DOM4J简介与特性 DOM4J是一个由dom4j.org开发的开源XML解析包,专为Java平台设计,它不仅支持DOM、SAX和JAXP标准,还巧妙地融入了Java集合框架,使其成为Java开发者在处理XML数据时...

    Dom4j遍历解析XML

    Dom4j 遍历解析 XML 是指使用 Dom4j 库来解析和遍历 XML 文档,提取其中的元素、属性和值。 在 Dom4j 中,遍历 XML 文档需要使用 SAXReader 对象来读取 XML 文件,并将其转换为 Document 对象。Document 对象是 Dom...

    分别使用DOM和DOM4j解析XML文件

    本篇文章将详细介绍如何使用DOM(Document Object Model)和DOM4j这两种流行的方法来解析XML文件。 首先,DOM是一种标准的W3C推荐的解析XML的方法,它将整个XML文档加载到内存中,形成一个树形结构,便于程序进行...

    dom4j---xml解析jar包

    在Java环境中,解析XML文档时,我们通常会遇到各种库,其中DOM4J是一个非常流行的、功能强大的开放源代码库。这个库不仅简化了XML处理,还提供了XPath和XSLT的支持,使其成为Java开发者处理XML的首选工具之一。 **...

    dom4j及xpath jar包

    使用DOM4J解析XML的基本步骤如下: 1. 加载XML文件:`Document document = DocumentHelper.parseText(xmlString);` 或 `File file = new File("path_to_xml"); Document document = DocumentHelper.parseText(file)...

    使用dom4j 和本地dom 解析xml 文件

    在压缩包文件"复件 dom"中,可能包含了示例代码或教程,用于演示如何使用DOM4J和本地DOM解析XML文件。通过查看这些文件,你可以更深入地了解两种方法的具体实现,并在实际项目中选择合适的方式处理XML数据。 总结来...

    Dom,Sax,Xpath解析XML实例

    以上就是DOM、SAX和XPath解析XML的基本知识和实例应用。通过这些技术,开发者可以根据实际需求选择最适合的方式来处理XML文档。在实际项目中,这三种解析方法都有其适用场景,理解它们的工作原理和优缺点,将有助于...

    DOM4J_xpath

    **DOM4J**是一款由dom4j.org开发的开源XML解析库,专为Java平台设计,它不仅支持DOM和SAX这两种标准的XML解析方式,还兼容JAXP(Java API for XML Processing)。DOM4J以其简洁易用而闻名,只要对基本的XML-DOM模型...

Global site tag (gtag.js) - Google Analytics