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,并输出数据:\n");
        sb.append(xmlFileName + "\n");
        sb.append("----------------遍历start----------------\n");
        //遍历当前元素(在此是根元素)的子元素
        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 + ":\n");
            sb.append("\tid=" + id + " sex=" + sex + "\n");
            sb.append("\t" + "name=" + name + " age=" + age + "\n");

            //获取当前元素e_pe(在此是person元素)下的子元素adds
            Element e_adds = e_pe.element("adds");
            sb.append("\t" + e_adds.getName() + "\n");

            //遍历当前元素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("\t\t" + e_add.getName() + ":" + " code=" + code + " value=\"" + add + "\"\n");
            }
            sb.append("\n");
        }
        sb.append("-----------------遍历end-----------------\n");
        System.out.println(sb.toString());

        System.out.println("---------通过XPath获取一个元素----------");
        Node node1 = document.selectSingleNode("/doc/person");
        System.out.println("输出节点:" +
                "\t"+node1.asXML());

        Node node2 = document.selectSingleNode("/doc/person/@sex");
        System.out.println("输出节点:" +
                "\t"+node2.asXML());

        Node node3 = document.selectSingleNode("/doc/person[name=\"zhangsan\"]/age");
        System.out.println("输出节点:" +
                "\t"+node3.asXML());

        System.out.println("\n---------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("\n---------通过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
时间: 2024-10-21 01:27:09

java Dom 解析 XML 详细解答的相关文章

org.w3c.dom(java dom)解析XML文档

位于org.w3c.dom操作XML会比较简单,就是将XML看做是一颗树,DOM就是对这颗树的一个数据结构的描述,但对大型XML文件效果可能会不理想 首先来了解点Java DOM 的 API:1.解析器工厂类:DocumentBuilderFactory 创建的方法:DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 2.解析器:DocumentBuilder 创建方法:通过解析器工厂类来获得 DocumentBu

java DOM解析xml文件出现#text节点解决方案

java DOM解析xml文件出现#text节点解决方案 原生java解析xml的方法提供了两个,DocumentBuilder 和 SAXParser. 试了第一个DOM方法,在解析输出节点过程中,getNodeName()输出节点名发现多出了几个#text节点. text.xml <?xml version="1.0" encoding="UTF-8"?> <!-- xml解析测试文件 --> <LData> <ldat

Java Dom解析xml

Dom解析是将xml文件全部载入,组装成一颗dom树,然后通过节点以及节点之间的关系来解析xml文件,下面结合这个xml文件来进行dom解析. Xml代码 <?xml version="1.0" encoding="UTF-8"?> <books> <book id="12"> <name>thinking in java</name> <price>85.5</pri

Java从零开始学四十二(DOM解析XML)

一.DOM解析XML xml文件 favorite.xml <?xml version="1.0" encoding="UTF-8" standalone="no"?> <PhoneInfo name="手机品牌"> <Brand name="华为"> <Type name="U8650"> </Type> </Brand

java中的xml简介与DOM解析xml

1. xml简介 XML:指可扩展标记语言, Extensible Markup Language:类似HTML.XML的设计宗旨是传输数据,而非显示数据. 一个xml文档实例: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <company name="Tencent" address="深圳市南山区"> 3 <department deptNo=&quo

JAVA中使用DOM解析XML文件

JAVA中使用DOM解析XML文件: 创建DocumentBuilderFactory的对象                                 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 创建DocumentBuilder对象 通过documentBuilder对象的parser方法加载xml文件到当前项目下 获取所有XML文件内节点的集合    getElementsByTagName()方

java中dom解析xml

从xml文件中得到某个节点中value的值,条件是已知道某一个子节点的参数,如下一片段, 已知 <name> 为 “Motor hand”的值,想从整个xml文件中得到此子节点的<value>所对应的值. “<field><name>Motor hand</name><value>Right</value><type>Dotted</type></field>” 此方法是dom 遍历,获

DOM的概念和简单应用:使用DOM解析XML数据

概念:DOM是Document Object Model的简称,即文档数据模型. Oracle公司提供了JAXP(Java API for XML Processing)来解析XML.JAXP会把XML文档转换成一个DOM树,JAXP的三个包都在JDK中. org.w3c.dom;W3C推荐的解析文档的接口 org.xml.sax;使用SAX解析XML文档的接口 javax.xml.parsers;解析器工厂工具 一.使用DOM解析XML文档的步骤 1.创建解析器工厂对象,即DocumentBu

xml语法、DTD约束xml、Schema约束xml、DOM解析xml

今日大纲 1.什么是xml.xml的作用 2.xml的语法 3.DTD约束xml 4.Schema约束xml 5.DOM解析xml 1.什么是xml.xml的作用 1.1.xml介绍 在前面学习的html语言,html是超文本标记语言,使用html语言规定好的标签来封装文本数据.而html使用的标签html语言规定好的,每个标签都有自己特定的功能. xml语言,可扩展的标记语言,这门语言它没有定义任何的标记,而标记是由使用者自己来定义,但是由于标签名称以及属性名称都由用户自己来命名,导致别人在使