package cn.itcast.xml;

 import cn.itcast.domain.Book;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Before;
import org.junit.Test; import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List; public class Dom4jDemo { private Document document; @Before
public void init() throws DocumentException {
SAXReader reader = new SAXReader();
InputStream is = Dom4jDemo.class.getClassLoader().getResourceAsStream("book.xml"); document = reader.read(is);
} @Test
public void parseMethod2() throws DocumentException {
//获取文档根元素,books
Element root = document.getRootElement(); //获取所有book元素
List<Element> bookElements = root.elements(); //解析所有book元素,并添加到books集合中
List<Book> books = new ArrayList<>(); for (Element bookElement : bookElements) {
//获取author属性值
String author = bookElement.attributeValue("author");
//获取子元素name的文本
String name = bookElement.element("name").getText();
//获取子元素price的文本
String priceStr = bookElement.element("price").getText();
double price = Double.parseDouble(priceStr);
//创建对应的book对象,并添加到books集合中
books.add(new Book(author, name, price));
} //打印
books.forEach(System.out::println); } @Test
public void parseMethod1() throws FileNotFoundException, DocumentException {
//获取根元素
Element root = document.getRootElement();
System.out.println(root.getName()); List<Book> books = new ArrayList<>(); //获取所有book元素,解析并保存到books集合中。
List<Node> bookNodes = document.selectNodes("/books/book");
for (Node bookNode : bookNodes) {
//获取作者
String author = bookNode.valueOf("@author");
// System.out.println(author); /*
斜杠开头表示文档,中间的斜杠则表示直接子节点
错误代码:
String name = bookNode.valueOf("/name");
表示选区文档下的name元素,而文档下只有books元素。
*/
//获取书名
List<Node> nameNodes = bookNode.selectNodes("name");
String bookName = nameNodes.get(0).getText();
// System.out.println(bookName); //获取价格
List<Node> priceNodes = bookNode.selectNodes("price");
double price = (double) Double.parseDouble(priceNodes.get(0).getText()); books.add(new Book(author, bookName, price));
} //打印结果
books.forEach(System.out::println);
}
}

Dom4jDemo.java

 package cn.itcast.domain;

 public class Book {
private String author;
private String name;
private Double price; public Book(){} public Book(String author, String name, Double price) {
this.author = author;
this.name = name;
this.price = price;
} public String getAuthor() {
return author;
} public void setAuthor(String author) {
this.author = author;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Double getPrice() {
return price;
} public void setPrice(Double price) {
this.price = price;
} @Override
public String toString() {
return "Book{" +
"author='" + author + '\'' +
", name='" + name + '\'' +
", price=" + price +
'}';
}
}

Book.java

 <?xml version="1.0" encoding="UTF-8"?>
<books>
<book author="天蚕土豆">
<name>斗破苍穹</name>
<price>86</price>
</book>
<book author="萧潜">
<name>缥缈之旅</name>
<price>92</price>
</book>
<book author="萧鼎">
<name>诛仙</name>
<price>98</price>
</book>
<book author="天下霸唱">
<name>鬼吹灯</name>
<price>124</price>
</book>
<book author="辰东">
<name>神墓</name>
<price>128</price>
</book>
</books>

book.xml

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>cn.itcast.xml-parser</groupId>
<artifactId>xml-parser-demo1</artifactId>
<version>1.0-SNAPSHOT</version> <dependencies>
<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.1</version>
</dependency> <!-- https://mvnrepository.com/artifact/jaxen/jaxen -->
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.6</version>
</dependency> <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies> </project>

pom.xml

 package cn.itcast.xml;

 import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test; import java.util.List;
/*
作者:北冥有鱼_很好吃
链接:https://www.jianshu.com/p/806bb1bdc06f
*/
public class Dom4j_02{ @Test
public void parse() throws Exception {
// 1. 创建一个 saxReader 对象
SAXReader saxReader = new SAXReader();
// 2. 将数据读取到 document 对象中
Document document = saxReader.read(Dom4j_02.class.getClassLoader().getResourceAsStream("servlet.xml"));
// 3. 使用 document 对象调用 getRootElement 方法获取根标签, 返回 Element 接口实现类对象
Element rootElement = document.getRootElement();
// 4. 使用 rootElement 根标签对象调用 elements 方法, 传入 servlet, 获取servlet标签对象
List<Element> servletElements = rootElement.elements("servlet");
// 5. 遍历, 并获取该标签下的子标签数据内容, 使用父标签对象调用elementText方法, 传入子标签名称获取数据
for (Element servlet : servletElements) {
String name = servlet.elementText("servlet-name");
String cls = servlet.elementText("servlet-class");
System.out.println(name + " : " + cls);
}
// 使用 rootElement 根标签对象调用 elements 方法, 传入 servlet-mapping, 获取servlet-mapping标签对象
List<Element> mappingElements = rootElement.elements("servlet-mapping");
for (Element mapping : mappingElements) {
String name = mapping.elementText("servlet-name");
String url = mapping.elementText("url-pattern");
System.out.println(name + " = " + url);
}
}
}

Dom4j_02.java 解析servlet.xml

 <?xml version="1.0" encoding="UTF-8"?>
<!--
作者:北冥有鱼_很好吃
链接:https://www.jianshu.com/p/806bb1bdc06f
-->
<servlets>
<servlet>
<servlet-name>servlet1</servlet-name>
<servlet-class>MyServlet1</servlet-class>
</servlet>
<servlet>
<servlet-name>servlet2</servlet-name>
<servlet-class>MyServlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet1</servlet-name>
<url-pattern>/s1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>servlet2</servlet-name>
<url-pattern>/s2</url-pattern>
</servlet-mapping>
</servlets>

servlet.xml

dom4j解析简单的xml文件 解析元素并封装到对象的更多相关文章

  1. DOM、SAX、JDOM、DOM4J以及PULL在XML文件解析中的工作原理以及优缺点对比

    1. DOM(Document Object Model)文档对象模型1. DOM是W3C指定的一套规范标准,核心是按树形结构处理数据,DOM解析器读入XML文件并在内存中建立一个结构一模一样的&qu ...

  2. XML文件解析-DOM4J方式和SAX方式

    最近遇到的工作内容都是和xml内容解析相关的. 1图片数据以base64编码的方式保存在xml的一个标签中,xml文件通过接口的方式发送给我,然后我去解析出图片数据,对图片进行进一步处理. 2.xml ...

  3. 通过正则表达式实现简单xml文件解析

    这是我通过正则表达式实现的xml文件解析工具,有些XHTML文件中包含特殊符号,暂时还无法正常使用. 设计思路:常见的xml文件都是单根树结构,工具的目的是通过递归的方式将整个文档树装载进一个Node ...

  4. xml解析之使用dom4j的api对xml文件进行CRUD(二)

    在使用dom4j的api对xml文件进行CRUD(一)见博客http://blog.csdn.net/qq_32059827/article/details/51524330的基础上,再对做一次练习. ...

  5. Android之旅十四 android中的xml文件解析

    在我们做有关android项目的时候,肯定会涉及到对xml文件的解析操作.以下给大家介绍一下xml文件的解析.包括DOM.SAX.Pull以及曾经我们用到的DOM4J和JDOM: 要解析的XML文件: ...

  6. 解析和操作XML文件

    Dom4j工具 使用步骤: 1)导入dom4j的核心包. dom4j-1.6.1.jar 2)编写Dom4j读取xml文件代码 1,Domj4读取xml文件 ,准备工作:读取整个文档并获取根节点 // ...

  7. Java XML文件解析

    四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例) 蓝色字体内容由上一篇博文中补充进来的,写作风格比较好,大家有兴趣可以去查看原文 众所周知,现在解析XML的方法越来越多,但主流的方法也就四 ...

  8. android基础知识13:AndroidManifest.xml文件解析

    注:本文转载于:http://blog.csdn.net/xianming01/article/details/7526987 AndroidManifest.xml文件解析. 1.重要性 Andro ...

  9. Android之AndroidManifest.xml文件解析

    转自:Android学习笔记之AndroidManifest.xml文件解析 一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文 ...

随机推荐

  1. BZOJ 1230 [Usaco2008 Nov]lites 开关灯:线段树异或

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1230 题意: 有n盏灯,一开始全是关着的. 有m次操作(p,a,b).p为0,则将区间[a ...

  2. 读取配置和动态配置(C方法)

    读取配置 无论何种配置文件,定义了配置文件之后,都统一使用系统提供的C方法(可以借助Config单词来帮助记忆)来读取已有的配置.用法:C('参数名称') 例如,读取当前的URL模式配置参数:$mod ...

  3. Java_Path_01_路径问题

    二.参考资料 1.java 路径问题 2.Java路径问题最终解决方案—可定位所有资源的相对路径寻址 3.Java获取文件的路径 4.Thread.currentThread().getContext ...

  4. Ice php配置

    1) Removed the php extension directories and recompiled apache/PHP2) Rebooted the machine.3) I remov ...

  5. HDU5875Function(单调队列)

    The shorter, the simpler. With this problem, you should be convinced of this truth.      You are giv ...

  6. bzoj 4278 Tasowanie 后缀数组+贪心

    题目大意 给定两个数字串A和B,通过将A和B进行二路归并得到一个新的数字串T,请找到字典序最小的T.\(len \leq 200000\) 题解 我们从归并排序的角度去想,每次把两者之一较小的取出来 ...

  7. 设计四个线程,其中两个线程每次对j加1,另外两个线程每次对j减1

    public class ManyThreads2 { private int j = 0; public synchronized void inc() { j++; System.out.prin ...

  8. javaCV开发详解之8:转封装在rtsp转rtmp流中的应用(无须转码,更低的资源消耗)

    javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...

  9. bzoj 1731 [Usaco2005 dec]Layout 排队布局——差分约束

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1731 对差分约束理解更深.还发现美妙博客:http://www.cppblog.com/me ...

  10. poj1456Supermarket——并查集压缩查找

    题目:http://poj.org/problem?id=1456 排序+贪心,每次选利润最大的,放在可能的最靠后的日期卖出,利用并查集快速找到下一个符合的日期. 代码如下: #include< ...