Java使用XPath查询XML中的元素

使用java中的xpath语法查询xml中元素

1.查询的xml文件为student.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<students>
 <student class="1201">
  <name>李小离</name>
  <sex>男</sex>
  <age>25</age>
 </student>
 <student class="1201">
  <name>林志玲</name>
  <sex>女</sex>
  <age>25</age>
 </student>
 <student class="1201">
  <name>廖新峰</name>
  <sex>男</sex>
  <age>25</age>
 </student>
 <student class="1302">
  <name>张军</name>
  <sex>男</sex>
  <age>25</age>
 </student>
 <student class="1302">
  <name>任峰</name>
  <sex>男</sex>
  <age>25</age>
 </student>
 <student class="1302">
  <name>林志东</name>
  <sex>男</sex>
  <age>25</age>
 </student>
 <student class="1302">
  <name>菜晓峰</name>
  <sex>男</sex>
  <age>25</age>
 </student>
 <student class="1302">
  <name>蔡依林</name>
  <sex>女</sex>
  <age>25</age>
 </student>
</students>

2.使用XPath查询步骤如下:

2.1创建一个XPathFactory的实例:

  XPathFactory xf = new XPathFactory();

2.2通过XPathFactory的实例获取一个XPath实例:

  XPath x = xf.newXPath();

2.3通过XPath实例的evaluate()方法对XML进行查询:

2.3.1 现在例举以下两个方法。

具体链接:http://docs.oracle.com/javase/8/docs/api/javax/xml/xpath/XPath.html

/*

expression:为XPath语法的查询语句。

source      :输入查询的*.xml的来源

returnType:返回结果的类型有:XPathConstants.NODE(单个元素),XPathConstants.NODESET(元素的集合)

具体的返回类型链接:http://docs.oracle.com/javase/8/docs/api/javax/xml/xpath/XPathConstants.html

String evaluate(String expression,InputSource source);

Object evaluate(String expression,InputSource source,return returnType);

*/

2.3.1新建一个SelectXML类:

import java.io.InputStream;

import org.xml.sax.InputSource;

import javax.xml.xpath.XPath;

import javax.xml.xpath.XPathConstants;

import javax.xml.xpath.XPathExpressionException;

import javax.xml.xpath.XPathFactory;

public class SelectXML{

  public void getSelectXML( String query_sentences) throws XPathExpressionException{

    XPathFactory pathFactory = XPathFactory.newInstance();

    XPath path = pathFactory.newXPath();

    //该student.xml文件为于src目录下。

    InputStream in = SelectXML.class.getResourceAsStream("/student.xml");

    InputSource source = new InputSource(in);//InputSource使用一次就会关闭,再次使用就用再new一次。

    //XPath语法的具体链接:http://www.w3school.com.cn/xpath/xpath_syntax.asp

    String query_sentences="/students/student/[name=‘李小离’]/age"。

    //通过姓名为“李小离”查询他的年龄。

    //String evaluate(String expression,InputSource source);

    String age = (Node)path.evaluate( query_sentences, source);

    sysotem.out.println("李小离的年龄是: "+ age);

  }

}

2.4.1新建一个数据存储类叫Student类:该类是用来将Java对象编码成为XML文件或是xml文件解码成为Java对象

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;

@XMLRootElement(name="student")//注入注解,标记在该类中根元素为student。

public class Student{

  @XmlAttribute(name="class")//标记student的属性是class.

  private clazz;

  private String name;

  private String sex;

  private String age;

  //set,get,tostring()省列。

}

2.4.2新建一个数据存储类叫StudentList类:该类是用来将Java对象编码成为XML文件或是xml文件解码成为Java对象

import java.util.List;

import javax.xml.bind.annotation.XmlElement;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="students") //注入注解,标记在该类中根元素为students。

public class StudentList{

private List<Student> students;

public List<Student> getStudents() {   return students;  }

@XmlElement(name="student") //注入注解,标记在该类中元素为student。

public void setStudents(List<Student> students) {   this.students = students;  }

}

2.4.2新建一个SelectXML类:

import java.io.InputStream;

import org.xml.sax.InputSource;

import javax.xml.xpath.XPath;

import javax.xml.xpath.XPathConstants;

import javax.xml.xpath.XPathExpressionException;

import javax.xml.xpath.XPathFactory;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class SelectXML{

  public NodeList getSelectXML( String query_sentences) throws XPathExpressionException{

    XPathFactory pathFactory = XPathFactory.newInstance();

    XPath path = pathFactory.newXPath();

    InputStream in = SelectXML.class.getResourceAsStream("/student.xml");

    InputSource source = new InputSource(in);

    String query_sentences = "/students/student"

    //String query_sentences = "/students/student[@class="1301"]"

      //Object evaluate(String expression,InputSource source,return retrunType);

    //查询所有学生的所有信息,返回一个集合。

    NodeList student_node = (NodeList)path.evaluate( query_sentences, source,XPathConstants.NODESET);

    //查询一个学生的所有信息,返回一个元素。

    //Node student_node = (Node)path.evaluate( query_sentences, source,XPathConstants.NODE);

    return student_node;

  }

  //使用JAXBContext->unmarshaller()方法对student.xml进行解码。

  //具体链接:http://docs.oracle.com/javase/8/docs/api/javax/xml/bind/Unmarshaller.html

  public List<Student> getUnmarshallerJAVA(NodeList nodelist) throws JAXBException{

    //创建解码器。

JAXBContext jc = JAXBContext.newInstance(Student.class);

Unmarshaller u = jc.createUnmarshaller();

List<Student> list = new LinkedList<>();

for(int i = 0;i<nodelist.getLength();i++){

Node node = nodelist.item(i);

//进行解码。

Student stu =(Student)u.unmarshal(node);

list.add(stu);
}
return list;

  }

//使用JAXBContext->marshaller()方法对Java中的对象进行编码。

  ////具体链接:http://docs.oracle.com/javase/8/docs/api/javax/xml/bind/marshaller.html

  public static void getMarshallerXML(List<Student> list) throws XPathExpressionException, JAXBException{
        // 创建编码器
        JAXBContext jc = JAXBContext.newInstance(StudentList.class);
        Marshaller u = jc.createMarshaller();
        StudentListstu = new StudentList();
        stu.setStudents(list);
        // 执行编码,在硬盘上创建xml文件。
       u.marshal(stu, new File("D:"+File.separator+"student.xml"));
    }

}

时间: 2024-12-17 03:36:30

Java使用XPath查询XML中的元素的相关文章

[Java] 通过XPath获取XML中某个节点的属性

public String getPAUrl(){ String PAUrl = ""; try { String filePath = System.getProperty ("user.dir").toString()+"/src/test/resources/config/environment.xml"; logger.info("The path of environment.xml is : "+filePath)

Java使用dom4j查询xml元素

1.Java使用dom4j查询xml元素: 1.1book.xml文件如下:<?xml version="1.0" encoding="UTF-8" ?> <books> <book>  <id>a1</id>  <name>疯狂Java讲义(附光盘)</name>  <author>李刚 编著</author>  <price>74.20<

Java比较两个数组中的元素是否相同的最简单方法

呵呵呵,实现Java比较两个数组中的元素是否相同的功能你是怎么做的?看下面最简单方法: import java.util.Arrays; public class Test { /** * Java比较两个数组中的元素是否相同 */ public static void main(String[] args) { String [] array1 = {"1","2","3"}; String [] array2 = {"3"

Maven pom.xml中的元素modules、parent、properties以及import

前言 项目中用到了maven,而且用到的内容不像利用maven/eclipse搭建ssm(spring+spring mvc+mybatis)用的那么简单:maven的核心是pom.xml,那么我就它来谈谈那些不同的地方: 给我印象最深的就是如下四个元素:modules.parent.properties.import. modules 从字面意思来说,module就是模块,而pom.xml中的modules也正是这个意思,用来管理同个项目中的各个模块:如果maven用的比较简单,或者说项目的模

web.xml中常用元素的解读

前言 针对一个项目而言,通常会有几类XML文件需要书写. web.xml spring-context.xml spring-mvc.xml other.xml ... 不管有多少配置文件,可以肯定的一点,这些配置文件,都是在web.xml中被指定的. 后续慢慢阐述. web.xml web.xml可以理解为一个Java Web项目入口.在web.xml中通常会有如下几种类型的节点存在,按照加载顺序排列. Listener 此为监听器,在上面3个中是后弦加载的,表示监听某个动作是否发生,发生后要

xml中所有元素转化为map

package demo; import java.io.ByteArrayInputStream; import java.io.UnsupportedEncodingException; import java.util.Iterator; import java.util.Map; /* *dom4j */ import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelp

Hibernate中持久化注解的java文件在applicationContext.xml中的配置

之前用Hibernate操作数据库,都是写下.hbm.xml配置文件的.这段时间发现注解要比.hbm.xml方便很多时,决定用注解. 之前用.hbm.xml时,在applicationContext.xml里配置是: <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="da

dom4j解析xml中指定元素下内容

需求:XML为如下样式,现在我只想取得timer下面的5000和60000. 解决办法如下: <?xml version="1.0" encoding="UTF-8"?> <we> <message id="1001"> <String>Id</String> <String>name</String> <String>sfz</String&g

Java泛型01--任意数组中两元素交换

package com.zl.generic; /** * 交换“任意”数组 中两个元素 */ public class GenericSwapArray { public static void main(String[] args) { swap(new String[]{"1","2","3"},1,2); } public static <T> T[] swap(T[] t,int i,int j) { System.out.