java编程之xpath介绍

一、使用dom4j支持XPATH的操作

—可以直接获取到某个元素,而不用一层一层的解析获取

XPATH如何使用:

第一种形式:/AAA/BBB/CCC,一个/代表一层,表示获取到AAA下面的BBB下面的CCC

第二种形式://BBB,表示和这个名称相同的都可以得到,只要名称是BBB都可以得到。//DDD/BBB:得到所有DDD下面的所有的BBB

第三种形式:/AAA/BBB/CCC/*,得到所有AAA下面BBB下面CCC下面的所有的元素。/*/*/*/BBB,表示限制前三层,前三层无论是什么名称都可以得到其下面的所有的BBB。//*,得到所有的元素。

第四种形式:/AAA/BBB[1],AAA下面的第一个BBB。/AAA/BBB[last()],表示得到AAA下面的最后一个BBB

第五种形式://@id,表示只要标签上有id属性都可以得到,得到所有有id属性的//BBB[@id],只要你BBB上有id属性都可以得到,得到有id属性的BBB

第六种形式://BBB[@id='b1'],得到含有属性id且值为b1的所有BBB

二、使用xpath

默认情况下,dom4j不支持xpath。

要想支持需要导入jar包,jaxen-1.1-beta-6.jar

有两个方法:selectNodes(“xpath标签表达式”);获得所有的元素,返回的是List,selectSingleNode(“xpath标签表达式”);获得一个元素,返回的是Node

1、查询xml中的所有name元素的值

步骤:获取document,使用方法selectNodes(“xpath标签表达式”);

public static void Test1() throws Exception {
    Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
    List<Node> list = document.selectNodes("//name");
    for (Node node : list) {
      //node是每一个元素具体的值
      //得到每一个元素具体的值
      String s = node.getText();
      System.out.println(s);
    }
  }

2、查询xml中第一个name的值。步骤:先获取document,然后构建xpath表达式。

public static void Test2() throws Exception{
    Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
    Node name1 = document.selectSingleNode("//p1[@id1='aaa']/name");
    //得到name的值
    String s1 = name1.getText();
    System.out.println(s1);
  }

二、案例分析

添加、删除、查询

student.xml

<?xml version="1.0" encoding="UTF-8"?>

<student>
 <stu>
  <id>01</id>
  <name>zhangsan</name>
  <age>20</age>
 </stu>
 <stu>
  <id>02</id>
  <name>lisi</name>
  <age>19</age>
 </stu>
</student>

student.java

package cn.qing.ov;
public class Student {
	private String id;
	private String name;
	private String age;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	@Override
	  public String toString() {
		return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
	}
}

stuService.java

package cn.qing.service;
import java.io.FileOutputStream;
import java.io.Writer;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import cn.qing.ov.Student;
public class StuService {
	//增加
	public static void addStu(Student student) throws Exception {
		SAXReader saxReader = new SAXReader();
		Document document = saxReader.read("src/student.xml");
		Element root = document.getRootElement();
		//在根节点上添加stu
		Element stu = root.addElement("stu");
		//在stu标签上一次添加id,name,age
		Element id1 = stu.addElement("id");
		Element name1 = stu.addElement("name");
		Element age1 = stu.addElement("age");
		//在id,name,age,上依次添加值
		id1.setText(student.getId());
		name1.setText(student.getName());
		age1.setText(student.getAge());
		//回写到xml中
		OutputFormat format = OutputFormat.createPrettyPrint();
		XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/student.xml"),format);
		xmlWriter.write(document);
		xmlWriter.close();
	}
	//删除,根据学生ID进行删除
	/**
   *
   * @param id
   * @throws Exception
   * 1.创建解析器
   * 2.获得document
   * 3.获取xml中的ID,使用xpath,返回一个list集合
   * 4.遍历list,判断集合里的值是否和传进来的id相同
   * 5.如果相同,把id所在的stu删除
   * 6.回写
   */
	public static void delStu(String id) throws Exception {
		SAXReader saxReader = new SAXReader();
		Document document = saxReader.read("src/student.xml");
		List<Node> list = document.selectNodes("//id");
		for (Node node : list) {
			String idv = node.getText();
			//判断是否和传递的值相同
			if(idv.equals(id)) {
				//得到stu的节点
				Element stu = node.getParent();
				//删除是通过父节点进行删除
				Element student = stu.getParent();
				student.remove(stu);
			}
		}
		OutputFormat format =OutputFormat.createPrettyPrint();
		XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/student.xml"),format);
		xmlWriter.write(document);
		xmlWriter.close();
	}
	//查询
	public static Student selStu(String id) throws Exception {
		SAXReader saxReader = new SAXReader();
		Document document = saxReader.read("src/student.xml");
		List<Node> list = document.selectNodes("//id");
		Student student = new Student();
		for (Node node : list) {
			//node 是每一个id的值
			String idv = node.getText();
			if(idv.equals(id)) {
				Element stu = node.getParent();
				String namev = stu.element("name").getText();
				String agev = stu.element("age").getText();
				student.setId(idv);
				student.setName(namev);
				student.setAge(agev);
			}
		}
		return student;
	}
}

测试Test.java

package cn.qing.test;
import cn.qing.ov.Student;
import cn.qing.service.StuService;
public class Test {
	public static void main(String[] args) throws Exception {
		//testAdd();
		//testDel();
		testSel();
	}
	//测试添加方法
	public static void testAdd() throws Exception {
		//创建student对象
		Student stu = new Student();
		stu.setId("03");
		stu.setName("wangwu");
		stu.setAge("18");
		StuService.addStu(stu);
	}
	//测试删除方法
	public static void testDel() throws Exception {
		StuService.delStu("03");
	}
	//测试查询方法
	public static void testSel() throws Exception {
		Student student = StuService.selStu("02");
		System.out.println(student.toString());
	}
}

对于每一种类型,可以为其设置在不同的包,编程的思想

总结

以上就是本文关于java编程之xpath介绍的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

您可能感兴趣的文章:

  • xpath简介_动力节点Java学院整理
  • JAVA通过XPath解析XML性能比较详解
  • java selenium XPath 定位实现方法
  • java使用xpath解析xml示例分享
  • java使用xpath和dom4j解析xml
  • 深入XPath的详解以及Java示例代码分析
(0)

相关推荐

  • java selenium XPath 定位实现方法

    xpath 的定位方法, 非常强大.  使用这种方法几乎可以定位到页面上的任意元素. 阅读目录 什么是xpath xpath定位的缺点 testXpath.html 代码如下 绝对路径定位方式 使用浏览器调试工具,可以直接获取xpath语句 绝对路径的缺点 绝对路径和相对路径的区别 相对路径定位方式 使用索引号定位 使用页面属性定位 模糊定位starts-with关键字 模糊定位contains关键字 text() 函数 文本定位 什么是xpath xpath 是XML Path的简称, 由于H

  • java使用xpath解析xml示例分享

    XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言.XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力.起初 XPath 的提出的初衷是将其作为一个通用的.介于XPointer与XSL间的语法模型.但是 XPath 很快的被开发者采用来当作小型查询语言. XPathTest.java 复制代码 代码如下: package com.hongyuan.test; import java.io.File;import java

  • xpath简介_动力节点Java学院整理

    简单说,xpath就是选择XML文件中节点的方法. 所谓节点(node),就是XML文件的最小构成单位,一共分成7种. - element(元素节点) - attribute(属性节点) - text (文本节点) - namespace (名称空间节点) - processing-instruction (处理命令节点) - comment (注释节点) - root (根节点) xpath可以用来选择这7种节点.不过,下面的笔记只涉及最常用的第一种element(元素节点),因此可以将下文中

  • 深入XPath的详解以及Java示例代码分析

    复制代码 代码如下: import java.io.IOException;import javax.xml.parsers.*;import javax.xml.xpath.*;import org.w3c.dom.*;import org.xml.sax.SAXException;public class XpathTest { public static void main(String[] args) throws ParserConfigurationException,   SAXE

  • JAVA通过XPath解析XML性能比较详解

    最近在做一个小项目,使用到XML文件解析技术,通过对该技术的了解和使用,总结了以下内容. 1 XML文件解析的4种方法 通常解析XML文件有四种经典的方法.基本的解析方式有两种,一种叫SAX,另一种叫DOM.SAX是基于事件流的解析,DOM是基于XML文档树结构的解析.在此基础上,为了减少DOM.SAX的编码量,出现了JDOM,其优点是,20-80原则(帕累托法则),极大减少了代码量.通常情况下JDOM使用时满足要实现的功能简单,如解析.创建等要求.但在底层,JDOM还是使用SAX(最常用).D

  • java使用xpath和dom4j解析xml

    1 XML文件解析的4种方法 通常解析XML文件有四种经典的方法.基本的解析方式有两种,一种叫SAX,另一种叫DOM.SAX是基于事件流的解析,DOM是基于XML文档树结构的解析.在此基础上,为了减少DOM.SAX的编码量,出现了JDOM,其优点是,20-80原则(帕累托法则),极大减少了代码量.通常情况下JDOM使用时满足要实现的功能简单,如解析.创建等要求.但在底层,JDOM还是使用SAX(最常用).DOM.Xanan文档.另外一种是DOM4J,是一个非常非常优秀的Java XML API,

  • java编程之xpath介绍

    一.使用dom4j支持XPATH的操作 -可以直接获取到某个元素,而不用一层一层的解析获取 XPATH如何使用: 第一种形式:/AAA/BBB/CCC,一个/代表一层,表示获取到AAA下面的BBB下面的CCC 第二种形式://BBB,表示和这个名称相同的都可以得到,只要名称是BBB都可以得到.//DDD/BBB:得到所有DDD下面的所有的BBB 第三种形式:/AAA/BBB/CCC/*,得到所有AAA下面BBB下面CCC下面的所有的元素./*/*/*/BBB,表示限制前三层,前三层无论是什么名称

  • java编程之AC自动机工作原理与实现代码

    在阅读本文之前,大家可以先参考下<多模字符串匹配算法原理及Java实现代码> 简介: 本文是博主自身对AC自动机的原理的一些理解和看法,主要以举例的方式讲解,同时又配以相应的图片.代码实现部分也予以明确的注释,希望给大家不一样的感受.AC自动机主要用于多模式字符串的匹配,本质上是KMP算法的树形扩展.这篇文章主要介绍AC自动机的工作原理,并在此基础上用Java代码实现一个简易的AC自动机. 1.应用场景-多模字符串匹配 我们现在考虑这样一个问题,在一个文本串text中,我们想找出多个目标字符串

  • 解析Java编程之Synchronized锁住的对象

    图片上传 密码修改为  synchronized是java中用于同步的关键字,一般我们通过Synchronized锁住一个对象,来进行线程同步.我们需要了解在程序执行过程中,synchronized锁住的到底是哪个对象,否则我们在多线程的程序就有可能出现问题. 看下面的代码,我们定义了一个静态变量n,在run方法中,我们使n增加10,然后在main方法中,我们开辟了100个线程,来执行n增加的操作,如果线程没有并发执行,那么n最后的值应该为1000,显然下面的程序执行完结果不是1000,因为我们

  • php+xml编程之xpath的应用实例

    本文实例讲述了php+xml编程之xpath的应用.分享给大家供大家参考.具体如下: xpath设计的核心思想:迅速定位到你所需要的元素(或者节点).PHP 文件在载入xml文件和创建DOMDocument 对象后,就可以开始建立DOMXPath 对象.建立形式如下: 复制代码 代码如下: $xpath = new DOMXPath($xmldoc); 建立 DOMXPath 对象后,就可以开始使用 DOMXPath::query()方法,找到你需要的元素: 复制代码 代码如下: $item =

  • Java编程之jdk1.4,jdk1.5和jdk1.6的区别分析(经典)

    本文结合实例详细分析了Java编程之jdk1.4,jdk1.5和jdk1.6的区别.分享给大家供大家参考,具体如下: 简单说:1.4和1.5最大的区别有两个,一个是1.5有泛型,另一个1.5可以自动封装八大基本数据类型的封装数据类型,即,Integer a = 4这个1.4是不可以的.1.5和1.6的区别不大.1.6我觉得最多的变化,我觉得最大的部分是在GUI上面,提供了很多方便的布局管理和扩展. 这段时间进了一家电子政务公司,都用weblogic8,那咱就用jdk1.4吧,eclipse一改j

  • Java 编程之IO流资料详细整理

    java IO详解: Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作. IO流的分类 根据处理数据类型的不同分为:字符流和字节流 根据数据流向不同分为:输入流和输出流  字符流和字节流 字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象.本质其实就是基于字节流读取时,去查了指定的码

  • 浅谈Java编程之if-else的优化技巧总结

    一.使用策略枚举来优化if-else 看到网上蛮多人推荐使用策略模式来优化if-else,但我总觉得,搞一堆策略类来优化大批量if-else,虽然想法很好,但无意之中很可能又会创造出很多类对象,就显得过于繁重了.若想使用策略模式来优化大批量if-else,其实有一种更好的方式,这是策略模式+枚举方式的改良 二.使用三目运算符来优化if-else 1.根据if-else条件来判断赋值的,如: String id=""; if(flag){ id="a"; }else{

  • Node.js 异步编程之 Callback介绍(一)

    Node.js 基于 JavaScript 引擎 v8,是单线程的.Node.js 采用了与通常 Web 上的 JavaScript 异步编程的方式来处理会造成阻塞的I/O操作.在 Node.js 中读取文件.访问数据库.网络请求等等都有可能是异步的.对于 Node.js 新人或者从其他语言背景迁移到 Node.js 上的开发者来说,异步编程是比较痛苦的一部分.本章将由浅入深为大家讲解 Node.js 异步编程的方方面面.从最基础的 callback 到 thunk.Promise.co 直到

  • Java并发编程之StampedLock锁介绍

    StampedLock: StampedLock是并发包里面JDK8版本新增的一个锁,该锁提供了三种模式的读写控制,当调用获取锁的系列函数时,会返回一个long 型的变量,我们称之为戳记(stamp),这个戳记代表了锁的状态.其中try 系列获取锁的函数,当获取锁失败后会返回为0的stamp值.当调用释放锁和转换锁的方法时需要传入获取锁时返回的stamp值. StampedLock提供的三种读写模式的锁分别如下: 写锁witeLock: 是一个排它锁或者独占锁,某时只有一个线程可以获取该锁,当一

  • Java并发编程之Condition源码分析(推荐)

    Condition介绍 上篇文章讲了ReentrantLock的加锁和释放锁的使用,这篇文章是对ReentrantLock的补充.ReentrantLock#newCondition()可以创建Condition,在ReentrantLock加锁过程中可以利用Condition阻塞当前线程并临时释放锁,待另外线程获取到锁并在逻辑后通知阻塞线程"激活".Condition常用在基于异步通信的同步机制实现中,比如dubbo中的请求和获取应答结果的实现. 常用方法 Condition中主要的

随机推荐