上一篇讲了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();
- }