Java 应用DOM方式解析XML文件

引入

java为啥需要解析XML的方法?

xml的优势:

它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。是Internet环境中跨平台的、依赖于内容的技术,也是当今处理分布式结构信息的有效工具。早在1998年,W3C就发布了XML1.0规范,使用它来简化Internet的文档信息传输

所以啊,java不得不爱。

DOM方式解析XML文件的步骤

1.从xml获得生成DOM对象树的解析器

语句:`

DocumentBuilderFactory docbf = DocumentBuilderFactory.newInstance();`

2.获得Doucument的生成器,可以利用解析器的newDocumentBuilder()获得示例

语句:

DocumentBuilder docb = docbf.newDocumentBuilder();

3.用DocumentBuilder的parse()解析xml文件获得Doucment对象。

语句:

Document doc = docb.parse("ProfessionalBooks.xml");

4.获得当前节点的所有子节点

            NodeList nodes = doc.getChildNodes();

5.由于xml是是树状结构,所以要写个函数遍历树。

public static void ReadTreeStructure(NodeList nodes) {

        // 遍历所有子节点
        for (int i = 0; i < nodes.getLength(); i++) {
            // 获得字节点名,判断子节点的类型,区分出text类型的node以及element类型的node
            if (nodes.item(i).getNodeType() == Node.ELEMENT_NODE) {
                System.out.print("该节点的名称为:" + nodes.item(i).getNodeName() + " ");
                String value = ((Text) (nodes.item(i).getFirstChild())).getData().trim();
                if (value.getBytes().length != 0) {
                    System.out.print("该节点的值为:" + value);
                }
                System.out.println();
                System.out.println();
            }

            // 获得子节点的值,如果没有就不输出

            // 如果子节点还有子节点就继续往下层读
            if (nodes.item(i).getChildNodes().getLength() != 0) {
                ReadTreeStructure(nodes.item(i).getChildNodes());
            }
        }
    }

具体代码:

1.解析代码

package com.imooc.domtest.test;

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.css.DocumentCSS;
import org.xml.sax.SAXException;
import org.w3c.dom.Text;
import com.sun.org.apache.xalan.internal.xsltc.dom.DocumentCache;

/**
 * @author wangahifeng
 *
 */
public class MyDOMTest {
    /**
     * @param args
     */
    /*
     * 写一个读取树的函数: 1:获得第一层子节点 2:获得子节点的属性 3:完成第一、二步后读取下一层回掉函数重复执行第一、二步后
     */
    public static void ReadTreeStructure(NodeList nodes) {

        // 遍历所有子节点
        for (int i = 0; i < nodes.getLength(); i++) {
            // 获得字节点名,判断子节点的类型,区分出text类型的node以及element类型的node
            if (nodes.item(i).getNodeType() == Node.ELEMENT_NODE) {
                System.out.print("该节点的名称为:" + nodes.item(i).getNodeName() + " ");
                String value = ((Text) (nodes.item(i).getFirstChild())).getData().trim();
                if (value.getBytes().length != 0) {
                    System.out.print("该节点的值为:" + value);
                }
                System.out.println();
                System.out.println();
            }

            // 获得子节点的值,如果没有就不输出

            // 如果子节点还有子节点就继续往下层读
            if (nodes.item(i).getChildNodes().getLength() != 0) {
                ReadTreeStructure(nodes.item(i).getChildNodes());
            }
        }
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // 用DocumentBuilderFactory的newInstance()从xml获得生成DOM对象树的解析器

        DocumentBuilderFactory docbf = DocumentBuilderFactory.newInstance();
        try {
            // 顾名思义DocumentBuilder是Doucument的生成器,可以利用解析器的newDocumentBuilder()获得示例
            DocumentBuilder docb = docbf.newDocumentBuilder();
            // 用DocumentBuilder的parse()解析xml文件获得Doucment对象下面就可以利用它获得xml文件的内容了
            Document doc = docb.parse("ProfessionalBooks.xml");
            System.out.println("该文档有" + doc.getChildNodes().getLength() + "个一层节点");
            // 获得当前节点的所有子节点
            NodeList nodes = doc.getChildNodes();
            ReadTreeStructure(nodes);
            // 下面决定写个方法一层一层剥开xml文件,由于xml是树的结构所以要用到读取树的方法
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

xml文件

<?xml version="1.0" encoding="UTF-8"?>
<bookstore id="1" name="书库">
    <booktyple id="1" type="软件">
        <book id="1">
            <name>java基础</name>
            <author>王大/author>
            <year>2014</year>
            <price>89</price>
        </book>
        <book id="2">
            <name>java高级</name>
            <year>2004</year>
            <price>77</price>
            <language>English</language>
        </book>
    </booktyple>
    <booktyple id="2" type="数学">
        <book id="1">
            <name>高数一</name>
            <author>王峰</author>
            <year>2014</year>
            <price>89</price>
        </book>
        <book id="2">
            <name>高数二</name>
            <year>2004</year>
            <price>77</price>
            <language>English</language>
        </book>
    </booktyple>
</bookstore>

结果图

这里写图片描述

注意:

    1.函数里面,筛选了xml的节点类型,因为xml的节点除了标签外,还存在text类型的节点,它一般只用来存放文字,没有NodeName。所以不用获取。

    2.这里的获得text类型的value是直接获得当前的子节点的value,但是element类型的node是没有value的,只有text类型的node才有,所以油用if语句筛选,至于为啥那样写,自己想,想想和用if (value.getBytes().length != null)的区别自己运行下。

    3.下图蓝色区域也是一个text类型的节点。放文字的也是text类型的节点,所以算外面element类型的node的子节点。

这里写图片描述

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 使用dom4j解析xml文件可以通过以下步骤完成: 1. 加载xml文件,可以使用以下代码: ``` DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new File("file.xml")); ``` 2. 获取根节点,使用以下代码: ``` Element root = doc.getRootElement(); ``` 3. 遍历子节点,使用以下代码: ``` List<Element> childList = root.elements(); for (Element child : childList) { //对子节点进行操作 } ``` 4. 获取节点属性,使用以下代码: ``` String attributeValue = element.attributeValue("attributeName"); ``` 5. 获取节点值,使用以下代码: ``` String value = element.getText(); ``` ### 回答2: Java是一种流行的编程语言,在处理XML文件时,有很多的库可供选择。dom4j则是其中的一种库,它是一种同步、线程安全的XML解析器,拥有高效、灵活、简单的API。 dom4j解析XML文件分为以下步骤: 1. 创建SAXReader对象,它是dom4j解析器的核心类。 2. 调用SAXReader对象的read()方法,通过文件输入流读取XML文件内容并将其转换成一个Document对象。 3. 从Document对象中取到根元素(root element)。 4. 从根元素开始递归遍历所有子元素,获取特定元素的值或属性,修改元素的值或属性。 下面对以上步骤进行详细说明: 1. 创建SAXReader对象 SAXReader对象是dom4j解析器的核心对象,要解析XML文件,需要先创建该对象。创建SAXReader对象的代码如下: SAXReader reader = new SAXReader(); 2. 解析XML文件解析XML文件,需要调用SAXReader对象的read()方法,并传入要解析XML文件名或者文件输入流。代码示例如下: Document document = reader.read(new File("test.xml")); 3. 获取根元素 解析完成后,需要获取XML文件的根元素(即文档的最外层标签)。获取根元素的代码如下: Element root = document.getRootElement(); 4. 遍历所有子元素 获取根元素之后,可以通过遍历所有子元素来获取需要的元素、属性或者修改元素内容。遍历子元素的代码如下: List<Element> elements = root.elements(); for(Element element : elements) { // 对元素进行处理 } dom4j除了上述基本步骤外,还提供了更多的API和工具类,方便我们在XML文件处理过程中进行元素的增删改查、元素内容的验证和转换等操作。总的来说,dom4j是一种易用、灵活的XML解析器,广泛应用Java开发领域。 ### 回答3: DOM4J是Java语言中的一种XML文档操作工具包,它可以方便地对XML文档进行创建、读取、修改、查询及输出等操作。使用DOM4J解析XML文件可以方便地从XML文件中读取数据、进行数据处理,并将处理的数据保存到指定的文件或数据源中。 在使用DOM4J解析XML文件时,我们首先需要通过文档工厂类创建DOM4J的文档对象,然后就可以通过该文档对象获取XML文档的根节点,并对其进行遍历操作。 在遍历XML文档时,我们可以通过getElement()方法获取指定节点的子节点或属性节点,并通过getText()方法获取节点中的文本内容。同样地,我们也可以使用XPath表达式来获取指定节点的数据。 除了读取XML文件,我们还可以使用DOM4J创建和修改XML文件。在创建XML文件时,我们可以通过创建根节点和子节点来构建整个XML文档,并使用输出流将其保存到指定位置。在修改XML文件时,我们可以通过获取指定节点并修改其内容来对XML文档进行更新。 总的来说,DOM4J是一种强大的XML文档操作工具包,它不仅提供了丰富的API函数,还支持XPath表达式和XSLT样式表,使得我们可以方便地对XML文档进行操作和处理。通过学习DOM4J,我们可以更好地掌握Java语言中XML文档的读取、创建和修改等技术,从而更好地开发出高质量的Java应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值