1.xml解析方式:
DOM(xml全部加载到内存中,生成一个document对象)
SAX(逐行扫描,边扫描边解析)
2.dom4j解析xml
- 引入dom4j maven依赖(dom4j:xml解析的类库 )
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
- 使用dom4j解析user.xml
案例解析对象 user.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE users SYSTEM "user.dtd">
<users>
<user id="TB1001" country="Chinese" source="Android">
<id>10001</id>
<name>admin</name>
<password>111111</password>
<salary> salaty >15000 & salary < 30000</salary>
</user>
<user id="TB1002" country="Chinese" source="Ios">
<id>10002</id>
<name>admin2</name>
<password>22 22</password>
<salary> salaty >15000 & salary < 30000</salary>
</user>
</users>
解析程序
几个方法:
- 获取根标签 :
Element rootElement = document.getRootElement();
- 获取根标签的子标签:
List<Element> elements = rootElement.elements();
- 获取子标签的属性:
List<Attribute> attributes = element.attributes();
- 获取子子标签:
List<Element> elementList = element.elements();
- 获取子子标签的文本:
element1.getText()
- 获取第一个user子标签:
Element user = rootElement.element("user");
- 获取user标签的子标签password的文本:
String password = user.elementText("password");
@Test
public void TestDom4j() {
//创建解析器对象
SAXReader saxReader = new SAXReader();
//读取xml生成document对象
try {
Document document = saxReader.read(Dom4j.class.getClassLoader().getResource("user.xml"));
//根据document对象可以获取xml的元素信息
Element rootElement = document.getRootElement();
//根结点的名字
System.out.println("根结点的名字: " + rootElement.getName());
//获取标签的子标签
List<Element> elements = rootElement.elements();
for (Element element : elements) {
System.out.println("users标签的子标签:__"+element.getName()+"__的id属性值:"+element.attributeValue("id"));
List<Attribute> attributes = element.attributes();
for (Attribute attribute : attributes) {
System.out.println("user标签的属性__"+attribute.getName()+"__属性值:"+attribute.getText());
}
List<Element> elementList = element.elements();
for (Element element1 : elementList) {
System.out.println("user的子标签:__"+element1.getName()+"__的文本"+element1.getText());
}
}
//获取users标签的第一个user标签
Element user = rootElement.element("user");
//第一个user标签password的文本
//elementText 获取指定子标签的文本
String password = user.elementText("password");
System.out.println("第一个user的password:"+password);
} catch (DocumentException e) {
e.printStackTrace();
}
}
结果:
3.dom4j结合Xpath解析xml
用路径来选中对应的节点**
- 引入jaxen maven依赖
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.2.0</version>
</dependency>
- 使用Xpath解析user.xml
案例解析对象 user.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE users SYSTEM "user.dtd">
<users>
<user id="TB1001" country="Chinese" source="Android">
<id>10001</id>
<name>admin</name>
<password>111111</password>
<salary> salaty >15000 & salary < 30000</salary>
</user>
<user id="TB1002" country="Chinese" source="Ios">
<id>10002</id>
<name>admin2</name>
<password>22 22</password>
<salary> salaty >15000 & salary < 30000</salary>
</user>
</users>
解析程序
xpath语法:
- 绝对路径方式方法 以/开头,从根元素开始,/元素/子元素/子子元素
- 相对路径,相对于当前结点元素继续查找结点
- 全文搜索 //子元素 无论中间多少层直接获取所有满足条件的子元素
- /表示一层
- 谓语(条件筛选形式) //元素[@atrr1=value]
- element是node子类,方法更多,使用更便捷
@Test
public void TestXpath(){
SAXReader saxReader = new SAXReader();
//target文件下面的xml
try {
Document document = saxReader.read(Dom4j.class.getClassLoader().getResource("user.xml"));
//第一个用户的密码
//强制转换(右键看图实现),不强制转换不可使用对应的方法
//绝对路径:
Element element= (Element)document.selectSingleNode("/users/user/password");
System.out.println("第一个用户的密码:"+element.getText());
//相对路径(相对password)
// ../ 表示返回上一层
Element element2 =(Element) element.selectSingleNode("../salary");
System.out.println("salary:"+element2.getText());
//全文搜索
//获取所有的id
List<Node> nodes = document.selectNodes("//id");
for (Node node : nodes) {
Element elementid=(Element) node;
System.out.println("所有id元素的文本"+elementid.getText());
}
//谓语形式
//user id为tb1002
Element tb1002element = (Element)document.selectSingleNode("//user[@id='TB1002']");
List<Element> list = tb1002element.elements();
for (Element elementuser : list) {
System.out.println(elementuser.getName() + ":"+elementuser.getText());
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
4.强制转换补充知识
向上转型和向下转型
向上:子赋值给父(父类引用指向子类对象),能调用父所有,不能调用子特有
向下:子类对象指向父类引用 调用子类所有