黑马程序员技术交流社区

标题: 【上海校区】dom4j解析xml 查找指定节点 [打印本页]

作者: 时间留下最真    时间: 2018-11-3 11:07
标题: 【上海校区】dom4j解析xml 查找指定节点
Java DOM4J解析器
介绍
DOM4J是一个开源的,基于Java的库来解析XML文档,它具有高度的灵活性,高性能和内存效率的API。这是java的优化,使用Java集合像列表和数组。它可以使用DOM,SAX,XPath和XSLT。它解析大型XML文档时具有极低的内存占用。

优点
DOM4J使Java开发的灵活性和XML解析代码易于维护。它是轻量级的,快速的API。

DOM4J 类
DOM4J定义了几个Java类。以下是最常见的类:

Document - 表示整个XML文档。文档Document对象是通常被称为DOM树。
Element - 表示一个XML元素。 Element对象有方法来操作其子元素,它的文本,属性和名称空间。
Attribute - 表示元素的属性。属性有方法来获取和设置属性的值。它有父节点和属性类型。
Node - 代表元素,属性或处理指令
常见DOM4J的方法
当使用DOM4J,还有经常用到的几种方法:

SAXReader.read(xmlSource)() - 构建XML源的DOM4J文档。
Document.getRootElement() - 得到的XML的根元素。
Element.node(index) - 获得在元素特定索引XML节点。
Element.attributes() - 获取一个元素的所有属性。
Node.valueOf(@Name) - 得到元件的给定名称的属性的值。

在使用Java的时候,发现获得指定节点的名称的时候不太方便,索性写了一个方法,方法如下:
[Java] 纯文本查看 复制代码
public class XMLParseUtils {

        public static void main(String[] args) {
                try {
                        Element rootNode = readXMLRoot("src\\DpnI5.xml");
                        Element foundNode=null;
                        Element hit_def = getNode(rootNode, "Hit_def", foundNode);
                        System.out.println(hit_def.getName());

                } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }

        /**
         * 根据文件路径获取xml根元素节点
         *
         * @param filePath 文件路径
         * @return
         * @throws Exception
         */
        public static Element readXMLRoot(String filePath) throws Exception {
                // 创建saxReader对象
                SAXReader reader = new SAXReader();
                // 通过read方法读取一个文件 转换成Document对象
                Document document = reader.read(new File(filePath));
                // 获取根节点元素对象
                Element node = document.getRootElement();
                return node;
        }

        /**
         * 查询节点
         * @param node 要查询数据的节点即根节点
         * @param nodeString 要查询的节点的名字
         * @param nodeFound 要查询的节点。传null即可
         * @return
         */
        public static Element getNode(Element node,String nodeString,Element nodeFound){
                if (nodeFound!=null){
                        return nodeFound;
                }else{
                        // 当前节点下面子节点迭代器
                        Iterator<Element> it = node.elementIterator();

                        while((it.hasNext())&&(nodeFound==null)){
                                Element e= it.next();
                                if (e.getName().equals(nodeString)){
                                        nodeFound=e;
                                }else{
                                        nodeFound=getNode(e,nodeString,nodeFound);
                                }
                        }
                }
                return nodeFound;
        }
}



作者: 不二晨    时间: 2018-11-7 09:01
ヾ(◍°∇°◍)ノ゙
作者: 魔都黑马少年梦    时间: 2018-11-8 16:59





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2