1.Document
导入dom4j的步骤
- 去官网下载 zip 包。http://www.dom4j.org/
- 在项目中创建一个文件夹:lib
- 将dom4j-2.1.1.jar文件复制到 lib 文件夹
- 在jar文件上点右键,选择 Add as Library -> 点击OK
- 在类中导包使用
得到Document对象
步骤:
文件Contact.xml放在src目录下
- 创建一个SAXReader对象,用于读取 xml 文件
- 从类路径下加载xml文件,得到输入流对象
- 通过 SAXReader对象的read(InputStream in )方法,从输入流中读取,生成文档对象
代码
/**1. 得到文档对象2. 得到根元素*/public static void main(String[] args) throws FileNotFoundException, DocumentException {//1. 创建类: 读取XML文件SAXReader reader = new SAXReader();//不建议这么写//FileInputStream in = new FileInputStream("D:\\IdeaWork\\JavaEE105\\day23-xml\\src\\Contacts.xml");//src目录就是编译以后的类路径,从类路径下得到输入。InputStream in = Demo3Document.class.getResourceAsStream("/Contacts.xml");//2.通过reader来读取xml, 生成了一个document对象Document document = reader.read(in);//3. 输出文档System.out.println(document);//4. 得到文档以后,通过文档得到根元素Element rootElement = document.getRootElement();System.out.println(rootElement);}
Document常用方法
方法名 | 功能说明 |
---|---|
Element getRootElement() | 通过文档对象得到根元素 |
String getName() | 获取元素名 |
List<Element> elements() | 获取所有子元素 |
List<Element> elements(String name) | 获取知名名字的多个子元素 |
2.Attribute
Attribute常用方法:
方法名 | 功能说明 |
---|---|
String getName() | 得到属性的名字 |
String getValue() | 得到属性的值 |
得到属性值的两种方式
- 先得到Attribute对象,再通过Attribute对象得到属性的值
- 通过方法attributeValue()直接得到属性值
案例:
- 使用2种方式,得到contact上id属性值
- 在contact元素上添加一个vip的属性值为true/false,得到contact上所有的属性名和属性值
效果
代码:
public static void main(String[] args) throws DocumentException {//1. 创建SAXReaderSAXReader reader = new SAXReader();//2. 调用read 方法,读取 xml 文件Document document = reader.read(Demo4Attribute.class.getResourceAsStream("/Contacts.xml"));//3. 得到根元素Element rootElement = document.getRootElement();//4. 获得第1个contact元素对象Element contact = rootElement.element("contact");//5. 通过方式1:得到contact上id属性值Attribute idAttr = contact.attribute("id");String idValue = idAttr.getValue();System.out.println(idValue);//6. 通过方式2:得到contact上id属性值String id = contact.attributeValue("id");System.out.println(id);//7. 得到contact上所有的属性名和属性值List<Attribute> attributes = contact.attributes();for (Attribute attribute : attributes) {System.out.println("属性名:" + attribute.getName());System.out.println("属性值:" + attribute.getValue());}}
获取文本内容
通过元素对象得到文本字符串得到文本元素的前提:先得到元素对象
- 注意:
空格、换行、制表符:也是属于文本的一部分,所以在解析xml文件的时候,格式化XML文件要注意。
元素中得到文本有关的方法
Element**元素中的方法 | 说明 |
---|---|
String getText() | 得到元素中文本 |
String elementTextTrim(元素名) | 得到子元素中文本,去掉先后空格 |
String elementText(元素名) | 得到子元素中文本 |
需求
得到第1个contact中的name元素,输出name元素的文本。分别通过下面三个方法得到:
- 通过getText()方法得到
- 直接得到元素的内容
- 得到去掉空格的文本
代码;
public static void main(String[] args) throws DocumentException {// 1.创建SAXReaderSAXReader reader = new SAXReader();// 2.调用read 方法,读取 xml 文件Document document = reader.read(Demo5Text.class.getResourceAsStream("/Contacts.xml"));// 3.得到根元素Element rootElement = document.getRootElement();// 得到contact标签Element contact = rootElement.element("contact");// 得到name标签中的文本Element name = contact.element("name");System.out.println(name.getText());// 得到子元素的文本System.out.println(contact.elementText("name"));// 得到子元素的文本并且去掉前后空格System.out.println(contact.elementTextTrim("name"));}
XML解析案例
目标
利用 Dom4j 的知识,将Contact.xml 文件中的联系人数据封装成List集合,其中每个元素是实体类Contact。打印输出 List 中的每个元素。
运行效果
数据准备
Contact.xml
<?xml version="1.0" encoding="UTF-8"?>
<contactList><contact id="1"><name>潘金莲</name><gender>女</gender><email>panpan@itcast.cn</email></contact><contact id="2"><name>武松</name><gender>男</gender><email>wusong@itcast.cn</email></contact><contact id="3"><name>武大狼</name><gender>男</gender><email>wuda@itcast.cn</email></contact>
</contactList>
Contact.java实体类
// 联系人实体类
public class Contact {private int id;private String name;private String gender;private String email;// 省略构造方法get、set、tostring}
代码:
public static void main(String[] args) throws DocumentException {//1. 得到SaxReaderSAXReader reader = new SAXReader();//2. 得到文档对象Document document = reader.read(Demo6Contact.class.getResourceAsStream("/Contact.xml"));//3. 得到根元素Element rootElement = document.getRootElement();//4. 创建集合List<Contact> list = new ArrayList<>();//5. 得到所有联系人List<Element> contactElements = rootElement.elements();//每个就是一个联系人for (Element contactElement : contactElements) {//创建一个联系人Contact contact = new Contact();//System.out.println(contactElement.getName()); //打印标签名//得到id属性值,将字符串转成int类型int id = Integer.parseInt(contactElement.attributeValue("id"));contact.setId(id);//得到子元素中文本contact.setName(contactElement.elementText("name"));contact.setGender(contactElement.elementText("gender"));contact.setEmail(contactElement.elementText("email"));//将当前对象添加到集合中list.add(contact);}//打印集合中所有的联系人for (Contact contact : list) {System.out.println(contact);}}