美文网首页我爱编程
XML——DOM解析

XML——DOM解析

作者: Colin_Version | 来源:发表于2016-07-31 23:06 被阅读66次

    DOM解析概述

    原理:xml解析器一次性把整个xml文档加载进内存,然后在内存中构建一颗Document的对象,通过Document对象,得到树上的节点对象,通过节点对象访问(操作)到xml文档的内容。

    解析工具:
    JAXP(sun公司官方)
    JDOM
    DOM4J
    

    利用DOM4J解析

    import java.io.File;
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.io.SAXReader;
    /**
     * 第一个Dom4j读取xml文档的例子
     * @author Colin
     */
    public class Demo1 {
    
        public static void main(String[] args) {
            try {
                //1.创建一个xml解析器对象
                SAXReader reader = new SAXReader();
                //2.读取xml文档,返回Document对象
                Document doc = reader.read(new File("./src/contact.xml"));
                
                System.out.println(doc);
            } catch (DocumentException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
    }
    
    

    节点的关系

    节点关系图.png

    得到节点信息

    private  static void test1() throws DocumentException{
            SAXReader reader = new SAXReader();
            Document document  = reader.read(new File("./src/contact.xml"));
            //2.nodeIterator: 得到当前节点下的所有子节点对象(不包含孙以下的节点)
            Iterator<Node> iterator = document.nodeIterator();
            while(iterator.hasNext()){
                Node node = iterator.next();
                String name = node.getName();
                System.out.println(name);        
            }
        }
    

    遍历xml文档的所有节点

    public void test2() throws Exception{
            //1.读取xml文档,返回Document对象
            SAXReader reader = new SAXReader();
            Document doc = reader.read(new File("./src/contact.xml"));
            //得到根标签
            Element rooElem = doc.getRootElement();
            getChildNodes(rooElem);
        }
        
        /**
         * 获取传入标签下的所有子节点
         * @param elem
         */
        private void getChildNodes(Element elem){
            System.out.println(elem.getName());
            //得到子节点
            Iterator<Node> it = elem.nodeIterator();
            while(it.hasNext()){
                Node node = it.next();
                //1.判断是否是标签节点
                if(node instanceof Element){
                    Element el = (Element)node;
                    //递归
                    getChildNodes(el);
                }
            }
        }
    

    注意:
    这里使用Element的getName方法获取了标签名称,下面这个例子对获取Element的方法做一总结

    public void test3() throws Exception{
            //1.读取xml文档,返回Document对象
            SAXReader reader = new SAXReader();
            Document doc = reader.read(new File("./src/contacts.xml"));
            
            //2.得到根标签
            Element  rootElem = doc.getRootElement();
            //得到标签名称
            String name = rootElem.getName();
            System.out.println(name);
            
            //3.得到当前标签下指定名称的第一个子标签
            /*
            Element contactElem = rootElem.element("contact");
            System.out.println(contactElem.getName());
            */
            
            //4.得到当前标签下指定名称的所有子标签
            /*
            Iterator<Element> it = rootElem.elementIterator("contact");
            while(it.hasNext()){
                Element elem = it.next();
                System.out.println(elem.getName());
            }
            */
            
            //5.得到当前标签下的的所有子标签
                   /*
           List<Element> list = rootElem.elements();
           for(Element e:list){
                System.out.println(e.getName());
            }
                  */
            
            
            //获取更深层次的标签(方法只能一层层地获取)
            Element nameElem = doc.getRootElement().
                        element("contact").element("name");
            System.out.println(nameElem.getName());
            
        }
    

    获取属性

    public void test4() throws Exception{
            //1.读取xml文档,返回Document对象
            SAXReader reader = new SAXReader();
            Document doc = reader.read(new File("./src/contact.xml"));
            
            //获取属性:(先获的属性所在的标签对象,然后才能获取属性)
            //1.得到标签对象
            Element contactElem = doc.getRootElement().element("contact");
            //2.得到属性
            //2.1  得到指定名称的属性值
            /*
            String idValue = contactElem.attributeValue("id");
            System.out.println(idValue);
            */
            
            //2.2 得到指定属性名称的属性对象
            /*Attribute idAttr = contactElem.attribute("id");
            //getName: 属性名称    getValue:属性值
            System.out.println(idAttr.getName() +"=" + idAttr.getValue());*/
            
            //2.3 得到所有属性对象,返回LIst集合
            /*List<Attribute> list = contactElem.attributes();
            //遍历属性
            for (Attribute attr : list) {
                System.out.println(attr.getName()+"="+attr.getValue());
            }*/
            
            //2.4 得到所有属性对象,返回迭代器
            Iterator<Attribute> it = contactElem.attributeIterator();
            while(it.hasNext()){
                Attribute attr = it.next();
                System.out.println(attr.getName()+"="+attr.getValue());
            }
            
        }
    

    获取文本

    public void test5() throws Exception{
            //1.读取xml文档,返回Document对象
            SAXReader reader = new SAXReader();     
            Document doc = reader.read(new File("./src/contact.xml"));
            
            /**
             * 注意: 空格和换行也是xml的内容
             */
            String content = doc.getRootElement().getText();
            System.out.println(content);
            
            //获取文本(先获取标签,再获取标签上的文本)
            Element nameELem = 
                doc.getRootElement().element("contact").element("name");
            //1. 得到文本
            String text = nameELem.getText();
            System.out.println(text);
            
            //2. 得到指定子标签名的文本内容
            String text2 = 
                doc.getRootElement().element("contact").elementText("phone");
            System.out.println(text2);
            
        }
    

    相关文章

      网友评论

        本文标题:XML——DOM解析

        本文链接:https://www.haomeiwen.com/subject/nahxsttx.html