首先导入Dom4J的jar包(密码:kjv8)
打印出xml文件中地产公司的id,名称和地址
demo01.xml
<companys>
<company id="1001">
<name>万科Aname>
<address>广东深圳address>
company>
<company id="1002">
<name>恒大Bname>
<address>广东广州address>
company>
<company id="1003">
<name>金地Cname>
<address>北京address>
company>
<company id="1006">
<name>绿地Dname>
<address>上海address>
company>
companys>
Company类
import java.io.Serializable;
public class Company implements Serializable{
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
private String address;
public Company() {}
public Company(String name, String address) {
this.name = name;
this.address = address;
}
public Company(Integer id, String name, String address) {
this.id = id;
this.name = name;
this.address = address;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Company other = (Company) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
@Override
public String toString() {
return "Company [id=" + id + ", name=" + name + ", address=" + address + "]\n\r";
}
}
DOM4J解析XML文件
import java.io.InputStream;
import java.util.Iterator;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* DOM4J解析XML文件
*/
public class XMLDemo1 {
public static void main(String[] args) throws DocumentException{
/** 1.创建一个读取XML文件的对象 用来指向XML文件的输入流
* 这个XML文件其实就是磁盘上的一个物理文件,我需要将它变成JAVA的对象
* 我们知道JAVA的对象是存在内存中的,所以我们就是要将物理的磁盘上的数据拿到内存中
* 那么首先我们是要将文件的内容拿到内存中,然后再内存中进行处理
*/
SAXReader reader = new SAXReader();
/**
* 2.创建一个(当前项目类路径下的)输入流 指向这个XML文件
* 因为它不是直接将文件内容拿到内存里,而是通过读取流,所以要先创建一个输入流
* 语法:
* InputStream 引用名 = 类名.class.getClassLoader().getResourceAsStream("文件名");
*/
InputStream is =
XMLDemo1.class.getClassLoader().getResourceAsStream("demo01.xml");
/**
*3.我们通过SAXReader这个对象利用流来读取这个对象 通过这个方法我们就把所有的XML数据拿到内存里了 返回了一个文档类型的对象
* 通过reader下的对象调用read()方法,并且将InputStream对象传进去
* 注意:导包的时候导入import org.dom4j.Document;包
*/
Document doc = reader.read(is);
/**
* 拿到XML的内容之后,首先我们要读取xml的根元素,再通过根元素读取子元素,再读取元素点里面的值
*/
/**
* 4.获取根元素
* 注意:导包的时候导入import org.dom4j.Element;
*/
Element root = doc.getRootElement();
//System.out.println(root.getName()); //获取根元素的名字 companys
/**
* 5.通过根元素获取子元素的迭代器
* 导入:
* import java.util.Iterator;包
* import org.dom4j.Attribute;包
*/
Iterator it = root.elementIterator();
while(it.hasNext()){
Element e = it.next();//获取子元素
//System.out.println(e.getName());
// 获取属性值:方法一: 通过元素对象获取元素属性值
//String id = e.attributeValue("id"); //获取属性id的值 注意在XML中拿到的所有数据都是String类型
// System.out.println(id);
// 获取元素的属性 方法二
Attribute idAttr = e.attribute("id");
String id = idAttr.getValue();
//System.out.println(id);
//通过元素对象获取子元素对象
Element nameElement = e.element("name");
//获取元素中的文本内容
String name = nameElement.getText();
//System.out.println(name); //万科A恒大B金地C招商D
//获取公司地址
Element addressElement = e.element("address");
String address = addressElement.getText();
System.out.println(address);
//封装对象
Company company = new Company();
company.setId(Integer.parseInt(id));
company.setName(name);
company.setAddress(address);
System.out.println(company);
/**
* Company [id=1001, name=万科A, address=广东深圳]
* Company [id=1002, name=恒大B, address=广东广州]
* Company [id=1003, name=金地C, address=北京]
* Company [id=1006, name=绿地D, address=上海]
*/
}
}
}
XPath应用解析xml文件,XPath应用和Dom4j是一个整体,实际上它是Dom4j里面的一个工具。
首先导入jaxen-1.1-beta-7.jar的jar包(密码:kjv8)
XPath是一门在XML文档中快速查找信息的语言。
单纯使用dom访问节点时,需要一层一层的处理。如果有了XPath,定位节点将变得很轻松,可以根据路径表达式快速检索元素、属性。
XPath应用通过路径的写法
/ :从根路径查找 "/companys/company/name"
//:从当前元素直接获取匹配的元素 "//name"
..:查找当前元素的父元素 ".."
. :查找当前元素
@ :查找当前元素的属性 "//company//@id"
import java.io.InputStream;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
*
* DOM4J解析XML XPath应用
*
*/
public class XMLDemo2 {
public static void main(String[] args) throws DocumentException {
//1、 创建一个读取XML文件的对象 用来读取指向XML文件的输入流
SAXReader reader = new SAXReader();
//2、创建一个输入流
InputStream is =
XMLDemo2.class.getClassLoader().getResourceAsStream("demo01.xml");
//3、获取当前XML文档对象
Document doc = reader.read(is);
Element root = doc.getRootElement();
//根据"/"路径获取元素
List list = root.selectNodes("/companys/company/name");
System.out.println(list.size());
for (Element element : list) {
System.out.println("name元素的值是:"+element.getText());
}
//根据"//"路径获取元素
List list1 = root.selectNodes("//name");
System.out.println(list1.size());
for (Element element : list1) {
System.out.println("name元素的值是:"+element.getText());
/**
* name元素的值是:万科A
name元素的值是:恒大B
name元素的值是:金地C
name元素的值是:绿地D
*/
}
//根据 ".."获取父元素,根据 "."获取当前元素,
Element companyEle = root.element("company");
//System.out.println(companyEle.attributeValue("id"));
Element fat = (Element) companyEle.selectSingleNode("..");//Node
//Element fat = (Element) companyEle.selectSingleNode(".");//Node
System.out.println("父节点"+fat.getName());//companys
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
//根据"@"获取属性
List list2 = root.selectNodes("//company//@id");
System.out.println(list2.size()); //4
for (Attribute attribute : list2) {
System.out.print(attribute.getValue()+" ");//1001 1002 1003 1006
}
}
}