上一篇讲了XML基本规则,现在讲讲XML的解析
1. DOM4J概述
1.1 什么是DOM4J
Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。
使用Dom4j开发,需下载dom4j相应的jar文件。
Dom4j的官方网站:http://sourceforge.net/projects/dom4j/
1.2 搭建Dom4j的开发环境
添加Dom4j的jar包即可:dom4j-1.6.1.jar
使用时注意要导入org.dom4j.*中的类。
2. 使用DOM4J读取XML文件
2.1 读取XML文档的方式
/**
* 获取document
* @return document
*/
public static Document GetDocument(){
Document document = null;
//方法一:
//1.读取XML文件,获得document对象
SAXReader saxReader = new SAXReader();
try {
document = saxReader.read(new File("D:\\person.xml"));
} catch (DocumentException e) {
e.printStackTrace();
}
/*//方法二:解析XML形式的文本,得到document对象
String xmlText="<person></person>";
try {
document = DocumentHelper.parseText(xmlText);
} catch (DocumentException e) {
e.printStackTrace();
}*/
return document;
}
2.2 遍历所有元素
public static void testRead() throws Exception {
// 读入XML文件,并获取document
Document document = GetDocument();
// 获取根节点
Element element = document.getRootElement();
// 从根节点开始,遍历所有的节点(Element是Node的子接口)
traverse(element);
}
// 遍历所有元素的递归方法
public static void traverse(Element element) {
//获取所以元素的迭代器
Iterator<Element> iter = element.elementIterator();
while(iter.hasNext()){
Element e = iter.next();
System.out.println(e);
traverse(e);
}
}
2.3 查找元素
/**
* 查找元素
* @param elementName 要查找的元素名称
* @return 返回查找到的元素,null表示没查找到
*/
public static Element findElement(String elementName) {
// 读入XML文件,并获取document
Document document = GetDocument();
// 获取根节点
Element rootElement = document.getRootElement();
//用来存储查找到的元素
Element myElement = null;
Iterator<Element> iter = rootElement.elementIterator();
while(iter.hasNext()){
Element ele = iter.next();
//查找到就赋值给myElement
if(ele.getName().equals(elementName)){
myElement = ele;
}
}
return myElement;
}
说明:就可以按照这种方式查找指定特征的元素或是属性。
2.4 获取一个元素的信息
2.4.1 基本信息
/**
* 获取元素的基本信息
* @param element表示要获取信息的元素
*/
public static void getElementInfo(Element element){
// 获取元素的名称(如果是标签,则是标签名;如果是属性,则是属性名)
String name = element.getName();
// 获取元素包含的文本内容(只是指这个标签体中的文本,如果只有子标签,则此值为空字符串)
String text = element.getText();
// 获取元素包含的所有文本(标签体中的文本,也包含子孙标签的文本内容)
String stringValue = element.getStringValue();
// 获取这个元素的XML源码
String xml = element.asXML();
}
2.4.2 与子元素有关的
/**
* 关于获取子元素
* @param parentElement 父元素
*/
public static void childElement(Element parentElement){
// 获取此元素的所包含的所有节点的数量
int nodeCount = parentElement.nodeCount();
// 获取此元素所包含的所有子节点的迭代器,包含标签、注释、文本等元素
Iterator<Node> nodeIter = parentElement.nodeIterator();
while(nodeIter.hasNext()){
Node node = nodeIter.next();
System.out.println(node.getName());
}
// 获取此元素的所有子标签的迭代器,只有标签元素,不包含注释与文本元素(迭代器、List集合)
//1.迭代器
Iterator<Element> elementIter = parentElement.elementIterator();
//2.list集合 二选一
List<Element> elementList = parentElement.elements();
}
2.4.3 与属性有关的
/**
* 获取元素属性
* @param element 元素
*/
public static void getAttribute(Element element){
//方法一:
// 获取此元素的属性的数量
int attrCount = element.attributeCount();
for(int i=0;i<attrCount;i++){
element.attribute(i);
}
// 获取此元素的所有属性(迭代器、List集合)
//方法二:
Iterator<Attribute> attrIter = element.attributeIterator();
//方法三:
List<Attribute> attrList = element.attributes();
}