一:什么是xml解析?
xml解析可以简单的理解为对xml文档里面的内容进行获取。当我们把数据存入xml文件里面以后,我们就希望通过程序获得xml的内容,我们可以运用java里面的IO知识是可以完成的,不过你需要非常繁琐的操作才能完成,并且会遇到不同的问题。为了解决这些问题,提供了不同的解析方式,并提交对那个的解析器,方便人员操作xml。
二:xml的解析方式?
①:DOM解析:将文档一次性加载到内存形成树形结构,进行解析。
优点:方便对树形结构进行操作,可以增删改操作。
缺点:若文档过大,容易导致内存溢出
②:SAX解析:Simple Api for Xml 事件驱动的方式,边读边解析。
优点:如果文档过大,不会导致内存溢出。
缺点:不能进行增删改操作。
③:PULL解析:Android内置的XML解析方式,类似SAX。
三:常用方法及操作
使用XPath获取元素:
1.selectSingleNode() 获得单个元素
2.selectNodes() 获得符合的元素集合
读取规则:
/开头表示从文档元素下开始读起
不带/则是读取当前元素的子元素
指定属性使用 [@] 一个属性使用一个
asXML() | 查看当前对应的xml语句 |
getName() | 拿到当前的标签名 |
getText() | 拿到当前标签中的文本值(混合元素和空元素没有值) |
attributeValue() | 获得标签中某个属性对应的值 |
attribute() | 获得当前对应的属性 |
attributeCount() | 拿到当前标签中的属性个数 |
attributes() | 拿到当前标签的属性集合 |
attributeIterator() | 拿到当前标签的属性集合迭代器 |
element() | 拿到名字符合的第一个元素 |
elements() | 拿到当前标签下的子标签集合 |
elementIterator() | 拿到子标签集合迭代器 |
ps:除了document之外 其他的都是节点(Node),同时也可以视为元素(Element)
四:代码演示
package com.test;
import java.io.File;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
public class Test2 {
public static void main(String[] args) throws Exception {
SAXReader sr=new SAXReader();//有了一个解析器
//d是文档对象
Document d = sr.read(Test2.class.getResourceAsStream("student.xml"));
Element root = d.getRootElement();//是一个元素 同时也是一个节点
System.out.println(root.asXML());
System.out.println(root.getName());
System.out.println(root.getText());
System.out.println(root.attributeValue("author"));
List<Element> es = root.elements();//获取当前节点下的子节点集合
for (Element e : es) {
System.out.println(e.getName());
System.out.println("sid:"+e.attributeValue("sid"));
System.out.println("gender:"+e.attributeValue("gender"));
List<Element> es2 = e.elements();//当前student元素下的子节点集合
for (Element e2 : es2) {
// 当前的标签名 标签值
System.out.println("\t"+e2.getName()+"\t"+e2.getText());
}
}
}
}
----------------------------------------------------config.xml文件--------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<config>
<action path="/regAction" type="test.RegAction">
<forward name="failed" path="/reg.jsp" redirect="false" />
<forward name="success" path="/login.jsp" redirect="true" />
</action>
<action path="/loginAction" type="test.LoginAction">
<forward name="failed" path="/login.jsp" redirect="false" />
<forward name="success" path="/main.jsp" redirect="true" />
</action>
</config>
-----------------------------------------------config.xml文件的解析-----------------------------------------------------
package com.test;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Test5 {
public static void main(String[] args) throws Exception {
// 需要解析器
SAXReader sr = new SAXReader();
// 得到文档对象
Document d = sr.read(Test3.class.getResourceAsStream("config.xml"));
//获取所有action中的type的值
//1.获得所有的action
List<Element> ls = d.selectNodes("/config/action");
//2.遍历 取属性
for (Element e : ls) {
System.out.println(e.attributeValue("type"));
}
//获取第二个action中的type的值
ls.get(1).attributeValue("type");
//获取第二个action的所有forward的path
List<Element> fs = ls.get(1).selectNodes("forward");
for (Element e : fs) {
System.out.println(e.attributeValue("path"));
}
//获取第二个action的第二个forward的path
fs.get(1).attributeValue("path");
}
}