1 使用dom4j解析xml
1.1 基本步骤
1.读取xml,得到Document对象
2.从Document里得到根节点对象
3.遍历dom树,找需要的标签
4.得到标签上的数据:属性值、标签体
1.2 相关的类
-
解析器:读取xml的,得到Document对象
-
SAXReader:使用sax方式读取xml,最终构建一棵dom树
-
DOMReader:使用dom方式读取xml,最终构建一棵dom树
-
SAXReader reader = new SAXReader();
Document document = reader.read(InputStream is);
-
从Document里得到根标签:
-
document.getRootElement()
-
-
从任意一标签里得到子标签
-
element.elements()
:获取所有的子标签,得到List -
element.elements(String elementName)
:获取所有指定名称的子标签,得到List -
element.element(String elementName)
:获取第一个指定名称的子标签,得到Element
-
-
从标签上得到数据:
-
element.getText()
:得到标签里的内容 -
element.attributeValues(String attrName)
:获取指定名称的属性值
-
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.io.InputStream;
import java.util.List;
/**
* 使用dom4j解析xml
*/
public class Demo01Dom4jParse {
/**
* 获取每个学生的姓名
* @throws DocumentException
*/
@Test
public void test1() throws DocumentException {
//1.读取xml,得到Document对象
SAXReader reader = new SAXReader();
InputStream inputStream = Demo01Dom4jParse.class.getClassLoader().getResourceAsStream("01xml/students.xml");
Document document = reader.read(inputStream);
//System.out.println(document);
//2. 从Document里得到根节点
Element rootElement = document.getRootElement();
//System.out.println(rootElement);
//3. 从根节点里得到所有的子标签student
//List<Element> elements = rootElement.elements();
List<Element> elements = rootElement.elements("student");
for (Element element : elements) {
//System.out.println(element);
//4. 获取每个student里的第一个name标签
Element name = element.element("name");
//System.out.println(name);
//5. 获取name标签里的内容
String nameText = name.getText();
System.out.println(nameText);
//6. 获取每个student里的第个description标签,得到内容
String description = element.element("description").getText();
System.out.println(description);
//7. 获取每个student的id属性值:学号
String id = element.attributeValue("id");
System.out.println(id);
System.out.println("---------------------------------------");
}
/*Element element = rootElement.element("teacher");
System.out.println(element);*/
}
}
2 使用xpath简化dom4j
2.1 常见xpath写法(了解)
/a/b/c: 找根标签a下的b标签,b标签下的c标签。 最终找的是符合条件的c标签 //a: 全文搜索a标签 //a[1]: 全文搜索a标签,只要第1个 //a[last()]:全文搜索a标签,只要最后一个 //@id: 全文搜索id属性 //a[@id]:全文搜索含有id属性的a标签 //a[@id="a1"]:全文搜索a标签,但是只要id属性值为a1的 /a/*: 找根标签a下所有的子标签 //*: 全文搜索所有标签 //a[@*] : 全文搜索有属性的a标签 //a[not(@*)]:全文搜索没有属性的a标签
2.2 dom4j使用xpath
-
步骤:导入jar包(dom4j的jar包,jaxen的jar包)
1. 读取xml文件,得到Document对象
2. 使用Document的方法,执行xpath表达式,得到结果
-
相关的方法:
-
Document里执行xpath的方法:
-
document.selectNodes(String xpath)
:得到所有符合xpath的节点集合,得到List<Node>
-
document.selectSingleNode(String xpath)
:得到第一个符合xpath的节点对象,得到Node对象
-
-
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.io.InputStream;
/**
* dom4j结合xpath表达式,查找标签。
* 例如:
* 要求得到students.xml里id为002的学生姓名。xpath是: //student[@id="002"]/name
* 要求得到c3p0-config.xml里,名称为heima的配置的驱动类名。xpath是://named-config[@name="heima"]/property[@name="driverClass"]
*/
public class Demo01XpathParse {
/**
* 要求1:查询得到student.xml里所有的姓名 xpath表达式: //name
* 要求2:查询得到student.xml里所有的学生姓名 xpath表达式://student/name
*
*/
@Test
public void test1() throws DocumentException {
//1.得到Document对象
SAXReader reader = new SAXReader();
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("01xml/students.xml");
Document document = reader.read(inputStream);
//2.直接执行xpath表达式: //name
//List<Node> nodes = document.selectNodes("//name");
/*List<Node> nodes = document.selectNodes("//student/name");
for (Node node : nodes) {
Element element = (Element) node;
String name = element.getText();
System.out.println("姓名:" + name);
}*/
//3.得到第一个学生的姓名 //student/name
Element element = (Element) document.selectSingleNode("//student/name");
System.out.println(element.getText());
}
}
3 dom4j解析和xpath解析对比
-
如果要解析xml,得到里边配置的所有数据:建议用dom4j,层层迭代遍历所有
-
如果要解析xml,只要里边的一部分数据:建议使用xpath,使用xpath表达式直接定位到节点,不需要层层迭代