zoukankan      html  css  js  c++  java
  • java Dom 解析 XML 详细解答

    Dom4j遍历解析XML测试
     
    近来老和XML打交道,不深挖不行了。。
     
    这是一个Dom4j解析XML的例子,为做复杂递归处理前期所写的例子。涵盖了XML的解析方面大部分核心API。
     
    环境:
    Dom4j-1.6.1
     
    Dom4j解析需要XML需要的最小类库为:
    dom4j-1.6.1.jar
    jaxen-1.1-beta-6.jar
     
    目标:
    解析一个xml,输出所有的属性和元素值。
     
    测试代码:
     
    XML文件:
    <?xml version="1.0" encoding="GBK"?>
    <doc>
        <person id="1" sex="m">
            <name>zhangsan</name>
            <age>32</age>
            <adds>
                <add code="home">home add</add>
                <add code="com">com add</add>
            </adds>
        </person>
        <person id="2" sex="w">
            <name>lisi</name>
            <age>22</age>
            <adds>
                <add ID="22" id="23" code="home">home add</add>
                <add ID="23" id="22" code="com">com add</add>
                <add id="24" code="com">com add</add>
            </adds>
        </person>
    </doc>
    

     解析代码:

    package com.topsoft.test;
    
    import org.dom4j.io.SAXReader;
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.Node;
    
    import java.util.Iterator;
    import java.util.List;
    import java.io.InputStream;
    
    /**
    * Created by IntelliJ IDEA.<br>
    * <b>User</b>: leizhimin<br>
    * <b>Date</b>: 2008-3-26 15:53:51<br>
    * <b>Note</b>: Dom4j遍历解析XML测试
    */
    public class TestDom4j {
        /**
         * 获取指定xml文档的Document对象,xml文件必须在classpath中可以找到
         *
         * @param xmlFilePath xml文件路径
         * @return Document对象
         */
        public static Document parse2Document(String xmlFilePath) {
            SAXReader reader = new SAXReader();
            Document document = null;
            try {
                InputStream in = TestDom4j.class.getResourceAsStream(xmlFilePath);
                document = reader.read(in);
            } catch (DocumentException e) {
                System.out.println(e.getMessage());
                System.out.println("读取classpath下xmlFileName文件发生异常,请检查CLASSPATH和文件名是否存在!");
                e.printStackTrace();
            }
            return document;
        }
    
        public static void testParseXMLData(String xmlFileName) {
            //产生一个解析器对象
            SAXReader reader = new SAXReader();
            //将xml文档转换为Document的对象
            Document document = parse2Document(xmlFileName);
            //获取文档的根元素
            Element root = document.getRootElement();
            //定义个保存输出xml数据的缓冲字符串对象
            StringBuffer sb = new StringBuffer();
            sb.append("通过Dom4j解析XML,并输出数据:
    ");
            sb.append(xmlFileName + "
    ");
            sb.append("----------------遍历start----------------
    ");
            //遍历当前元素(在此是根元素)的子元素
            for (Iterator i_pe = root.elementIterator(); i_pe.hasNext();) {
                Element e_pe = (Element) i_pe.next();
                //获取当前元素的名字
                String person = e_pe.getName();
                //获取当前元素的id和sex属性的值并分别赋给id,sex变量
                String id = e_pe.attributeValue("id");
                String sex = e_pe.attributeValue("sex");
                String name = e_pe.element("name").getText();
                String age = e_pe.element("age").getText();
                //将数据存放到缓冲区字符串对象中
                sb.append(person + ":
    ");
                sb.append("	id=" + id + " sex=" + sex + "
    ");
                sb.append("	" + "name=" + name + " age=" + age + "
    ");
    
                //获取当前元素e_pe(在此是person元素)下的子元素adds
                Element e_adds = e_pe.element("adds");
                sb.append("	" + e_adds.getName() + "
    ");
    
                //遍历当前元素e_adds(在此是adds元素)的子元素
                for (Iterator i_adds = e_adds.elementIterator(); i_adds.hasNext();) {
                    Element e_add = (Element) i_adds.next();
                    String code = e_add.attributeValue("code");
                    String add = e_add.getTextTrim();
                    sb.append("		" + e_add.getName() + ":" + " code=" + code + " value="" + add + ""
    ");
                }
                sb.append("
    ");
            }
            sb.append("-----------------遍历end-----------------
    ");
            System.out.println(sb.toString());
    
    
            System.out.println("---------通过XPath获取一个元素----------");
            Node node1 = document.selectSingleNode("/doc/person");
            System.out.println("输出节点:" +
                    "	"+node1.asXML());
    
            Node node2 = document.selectSingleNode("/doc/person/@sex");
            System.out.println("输出节点:" +
                    "	"+node2.asXML());
    
            Node node3 = document.selectSingleNode("/doc/person[name="zhangsan"]/age");
            System.out.println("输出节点:" +
                    "	"+node3.asXML());
    
            System.out.println("
    ---------XPath获取List节点测试------------");
            List list = document.selectNodes("/doc/person[name="zhangsan"]/adds/add");
            for(Iterator it=list.iterator();it.hasNext();){
                Node nodex=(Node)it.next();
                System.out.println(nodex.asXML());
            }
    
            System.out.println("
    ---------通过ID获取元素的测试----------");
            System.out.println("陷阱:通过ID获取,元素ID属性名必须为“大写ID”,小写的“id”会认为是普通属性!");
            String id22 = document.elementByID("22").asXML();
            String id23 = document.elementByID("23").asXML();
            String id24 = null;
            if (document.elementByID("24") != null) {
                id24 = document.elementByID("24").asXML();
            } else {
                id24 = "null";
            }
    
            System.out.println("id22=  " + id22);
            System.out.println("id23=  " + id23);
            System.out.println("id24=  " + id24);
        }
    
    
        public static void main(String args[]) {
            testParseXMLData("/person.xml");
        }
    }
    

     运行结果:

    通过Dom4j解析XML,并输出数据:
    /person.xml
    ----------------遍历start----------------
    person:
        id=1 sex=m
        name=zhangsan age=32
        adds
      add: code=home value="home add"
      add: code=com value="com add"
    
    person:
        id=2 sex=w
        name=lisi age=22
        adds
      add: code=home value="home add"
      add: code=com value="com add"
      add: code=com value="com add"
    
    -----------------遍历end-----------------
    
    ---------通过XPath获取一个元素----------
    输出节点:    <person id="1" sex="m">
            <name>zhangsan</name>
            <age>32</age>
            <adds>
                <add code="home">home add</add>
                <add code="com">com add</add>
            </adds>
        </person>
    输出节点:    sex="m"
    输出节点:    <age>32</age>
    
    ---------XPath获取List节点测试------------
    <add code="home">home add</add>
    <add code="com">com add</add>
    
    ---------通过ID获取元素的测试----------
    陷阱:通过ID获取,元素ID属性名必须为“大写ID”,小写的“id”会认为是普通属性!
    id22=  <add ID="22" id="23" code="home">home add</add>
    id23=  <add ID="23" id="22" code="com">com add</add>
    id24=  null
    
    Process finished with exit code 0 
    
  • 相关阅读:
    JavaScript 简介
    HTML 标签列表
    HTML5 是什么
    初识HTML5
    Conda 环境增删改查导出导入
    Windows 下安装 CGAL 并验证安装
    3D 点云数据集整理分析
    内网穿透
    SSH 免密登录
    串口、COM口、TTL、RS-232、RS-485区别详解
  • 原文地址:https://www.cnblogs.com/lomomiao/p/3932552.html
Copyright © 2011-2022 走看看