使⽤dom4j解析xml 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 = ad(InputStream is);
从Document⾥得到根标签:
从任意⼀标签⾥得到⼦标签
element.elements():获取所有的⼦标签,得到List
element.elements(String elementName):获取所有指定名称的⼦标签,得到List
element.element(String elementName):获取第⼀个指定名称的⼦标签,得到Element 从标签上得到数据:
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 = ClassLoader().getResourceAsStream("l");        Document document = ad(inputStream);
//System.out.println(document);
//2. 从Document⾥得到根节点
Element rootElement = RootElement();
//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 = Text();
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标签,只要最后⼀个
使用dom4j解析xml文件
//@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表达式,查标签。
* 例如:
*  要求得到l⾥id为002的学⽣姓名。xpath是: //student[@id="002"]/name
*  要求得到l⾥,名称为heima的配置的驱动类名。xpath是://named-config[@name="heima"]/property[@name="driverClass"] */
public class Demo01XpathParse {
/**
* 要求1:查询得到l⾥所有的姓名  xpath表达式: //name
* 要求2:查询得到l⾥所有的学⽣姓名  xpath表达式://student/name
*
*/
@Test
public void test1() throws DocumentException {
//1.得到Document对象
SAXReader reader = new SAXReader();
InputStream inputStream = Class().getClassLoader().getResourceAsStream("l");
Document document = ad(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 = Text();
System.out.println("姓名:" + name);
}*/
//3.得到第⼀个学⽣的姓名  //student/name
Element element = (Element) document.selectSingleNode("//student/name");
System.out.Text());
}
}
3 dom4j解析和xpath解析对⽐
如果要解析xml,得到⾥边配置的所有数据:建议⽤dom4j,层层迭代遍历所有
如果要解析xml,只要⾥边的⼀部分数据:建议使⽤xpath,使⽤xpath表达式直接定位到节点,不需要层层迭代

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。