`
haiyupeter
  • 浏览: 425927 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

dom中使用xpath解析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;




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

    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的表达式

分享到:
评论

相关推荐

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

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

    Dom,Sax,Xpath解析XML实例

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

    使用DOM4J和xpath解析XML(一)

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

    js中使用xpath来解析xml元素实用.pdf

    总结一下,JavaScript中使用XPath解析XML元素的关键知识点包括: 1. XPath是用于在XML文档中查找信息的语言,它基于路径表达式。 2. `selectNodes()`和`selectSingleNode()`方法在IE中用于选取XML节点,但不是标准...

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

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

    dom4j解析xml详解

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

    基于Xpath的xml文件查询和更新

    更新XML文件通常涉及DOM(Document Object Model)解析,将XML文件加载到内存中形成一个可操作的树形结构。例如,使用Python的`lxml`库: ```python from lxml import etree # 加载XML tree = etree.parse('...

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

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

    Dom4j 解析Xml文档及 XPath查询 学习笔记

    总结,Dom4j是Java中解析XML的强大工具,结合XPath,能够高效地查找、处理XML文档中的数据。通过熟练掌握这两个技术,可以轻松地处理复杂的XML操作。同时,持续查阅官方文档,有助于深入理解和应用Dom4j的各种功能。

    Java中使用xpath获取xml中的数据

    在这个例子中,我们首先创建一个`DocumentBuilder`实例,然后解析XML文件到`Document`对象。接着,通过`XPathFactory`和`XPath`接口,我们可以编译XPath表达式并执行它。`evaluate()`方法返回的结果可以是节点集、...

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

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

    Java解析xml配置文件,DOM4J解析xml配置文件,提供使用文档和源码下载

    提供的`Java解析xml文件.docx`文档应该包含了详细的步骤和示例代码,帮助你理解和实现上述过程。同时,`xmlparse`可能是包含示例XML文件或与解析相关的Java源码的文件夹,供你参考和实践。 总结,DOM4J为Java开发者...

    使用dom4j进行解析XML

    本文将详细介绍如何使用dom4j解析XML,并创建XML文档结构。 首先,我们需要引入dom4j库。如果你使用的是Maven项目,可以在pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;dom4j &lt;artifactId&gt;dom4j &lt;version&gt;...

    Java使用sax、dom、dom4j解析xml文档

    Java提供了多种解析XML的API,包括SAX(Simple API for XML)、DOM(Document Object Model)以及DOM4J。下面我们将详细探讨这些解析方式及其在实际开发中的应用。 1. SAX解析器: SAX是一种基于事件驱动的解析器,...

    dom4j解析xml文件的压缩包

    4. **XPath支持**:DOM4J支持XPath表达式,这允许开发者根据XPath查询XML文档中的特定节点,极大提高了代码的可读性和效率。 5. **事件驱动解析(SAX)**:除了传统的DOM解析外,DOM4J还支持SAX解析器,这种解析...

    dom+xpath读取xml并导入oracle.rar

    《DOM与XPath解析XML并导入Oracle数据库的深度实践》 在现代软件开发中,XML(eXtensible Markup Language)作为一种通用的数据交换格式,广泛应用于系统间的通信与数据存储。而DOM(Document Object Model)与...

    使用dom4j和jaxen解析xml

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

    dom4j和xpath的jar包

    DOM4J可以加载和解析XML文档,然后利用XPath表达式进行数据检索。这种方式避免了传统遍历DOM树的低效,尤其是在大型XML文档中,XPath的查询性能优势尤为明显。 在Java项目中,通常会将DOM4J和XPath的jar包打包在...

Global site tag (gtag.js) - Google Analytics