开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情
解析
XML 解析就是从 XML 中获取到数据,DOM 是解析思想
DOM(Document Object Model):文档对象模型,把文档的各个组成部分看做成对应的对象,把 XML 文件全部加载到内存,在内存中形成一个树形结构,再获取对应的值
Dom4J 实现:
-
Dom4J 解析器构造方法:
SAXReader saxReader = new SAXReader()
-
SAXReader 常用 API:
public Document read(File file)
:Reads a Document from the given Filepublic Document read(InputStream in)
:Reads a Document from the given stream using SAX
-
Java Class 类 API:
public InputStream getResourceAsStream(String path)
:加载文件成为一个字节输入流返回
根元素
Document 方法:Element getRootElement()
获取根元素
// 需求:解析books.xml文件成为一个Document文档树对象,得到根元素对象。
public class Dom4JDemo {
public static void main(String[] args) throws Exception {
// 1.创建一个dom4j的解析器对象:代表整个dom4j框架。
SAXReader saxReader = new SAXReader();
// 2.第一种方式(简单):通过解析器对象去加载xml文件数据,成为一个Document文档树对象。
//Document document = saxReader.read(new File("Day13Demo/src/books.xml"));
// 3.第二种方式(代码多点)先把xml文件读成一个字节输入流
// 这里的“/”是直接去src类路径下寻找文件。
InputStream is = Dom4JDemo01.class.getResourceAsStream("/books.xml");
Document document = saxReader.read(is);
System.out.println(document);
//org.dom4j.tree.DefaultDocument@27a5f880 [Document: name null]
// 4.从document文档树对象中提取根元素对象
Element root = document.getRootElement();
System.out.println(root.getName());//books
}
}
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="0001" desc="第一本书">
<name> JavaWeb开发教程</name>
<author> 张孝祥</author>
<sale>100.00元 </sale>
</book>
<book id="0002">
<name>三国演义</name>
<author>罗贯中</author>
<sale>100.00元</sale>
</book>
<user>
</user>
</books>
子元素
Element 元素的 API:
- String getName():取元素的名称。
- List elements():获取当前元素下的全部子元素(一级)
- List elements(String name):获取当前元素下的指定名称的全部子元素(一级)
- Element element(String name):获取当前元素下的指定名称的某个子元素,默认取第一个(一级)
public class Dom4JDemo {
public static void main(String[] args) throws Exception {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File("Day13Demo/src/books.xml"));
// 3.获取根元素对象
Element root = document.getRootElement();
System.out.println(root.getName());
// 4.获取根元素下的全部子元素
List<Element> sonElements = root.elements();
for (Element sonElement : sonElements) {
System.out.println(sonElement.getName());
}
// 5.获取根源下的全部book子元素
List<Element> sonElements1 = root.elements("book");
for (Element sonElement : sonElements1) {
System.out.println(sonElement.getName());
}
// 6.获取根源下的指定的某个元素
Element son = root.element("user");
System.out.println(son.getName());
// 默认会提取第一个名称一样的子元素对象返回!
Element son1 = root.element("book");
System.out.println(son1.attributeValue("id"));
}
}
属性
Element 元素的 API:
- List attributes():获取元素的全部属性对象
- Attribute attribute(String name):根据名称获取某个元素的属性对象
- String attributeValue(String var):直接获取某个元素的某个属性名称的值
Attribute 对象的 API:
- String getName():获取属性名称
- String getValue():获取属性值
public class Dom4JDemo {
public static void main(String[] args) throws Exception {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File("Day13Demo/src/books.xml"));
Element root = document.getRootElement();
// 4.获取book子元素
Element bookEle = root.element("book");
// 5.获取book元素的全部属性对象
List<Attribute> attributes = bookEle.attributes();
for (Attribute attribute : attributes) {
System.out.println(attribute.getName()+"->"+attribute.getValue());
}
// 6.获取Book元素的某个属性对象
Attribute descAttr = bookEle.attribute("desc");
System.out.println(descAttr.getName()+"->"+descAttr.getValue());
// 7.可以直接获取元素的属性值
System.out.println(bookEle.attributeValue("id"));
System.out.println(bookEle.attributeValue("desc"));
}
}
文本
Element:
- String elementText(String name):可以直接获取当前元素的子元素的文本内容
- String elementTextTrim(String name):去前后空格,直接获取当前元素的子元素的文本内容
- String getText():直接获取当前元素的文本内容
- String getTextTrim():去前后空格,直接获取当前元素的文本内容
public class Dom4JDemo {
public static void main(String[] args) throws Exception {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File("Day13Demo/src/books.xml"));
Element root = document.getRootElement();
// 4.得到第一个子元素book
Element bookEle = root.element("book");
// 5.直接拿到当前book元素下的子元素文本值
System.out.println(bookEle.elementText("name"));
System.out.println(bookEle.elementTextTrim("name")); // 去前后空格
System.out.println(bookEle.elementText("author"));
System.out.println(bookEle.elementTextTrim("author")); // 去前后空格
System.out.println(bookEle.elementText("sale"));
System.out.println(bookEle.elementTextTrim("sale")); // 去前后空格
// 6.先获取到子元素对象,再获取该文本值
Element bookNameEle = bookEle.element("name");
System.out.println(bookNameEle.getText());
System.out.println(bookNameEle.getTextTrim());// 去前后空格
}
}