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"));
    }

 

 

 

 

 

 

 

 

 

 

}

 

posted @ 2015-09-08 23:24  JJ急吧  阅读(2384)  评论(0编辑  收藏  举报