转载文章 Java读取xml文件

转载文章 Java读取xml文件

原文链接:Java读取xml文件

使用Java读取XML文件有四种方式:

  1. DOM
  2. SAX
  3. DOM4j
  4. JDOM

book.xml文件内容:

<?xml version="1.0" encoding="UTF-8"?>
<书架>
    <>
        <书名 编号="a_1">JavaWeb程序开发入门</书名>
        <作者 分类="AA">传智播客</作者>
        <售价 单位="">60</售价>
    </>
    <>
        <书名 编号="a_2">JavaWeb从入门到精通</书名>
        <作者 分类="BB">明日科技</作者>
        <售价>80</售价>
    </>
    <>
        <书名 编号="a_3">计算机文化基础</书名>
        <作者 分类="CC">山东商务</作者>
        <售价>40</售价>
    </>
</书架>

1.DOM

DOM 解析 XML 的步骤:

  1. 创建一个 DocumentBuilderFactory 的对象。

  2. 创建一个 DocumentBuilder 对象。

  3. 通过DocumentBuilder的parse(…)方法得到Document对象。

  4. 通过 getElementsByTagName(…)方法获取到节点的列表。

  5. 通过 for 循环遍历每一个节点。

  6. 得到每个节点的属性和属性值。

  7. 得到每个节点的节点名和节点值。

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

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


public class DomXmlDemo {

    // 用Element方式
    public static void element(NodeList list) {
        for (int i = 0; i < list.getLength(); i++) {
            Element element = (Element) list.item(i);
            NodeList childNodes = element.getChildNodes();
            for (int j = 0; j < childNodes.getLength(); j++) {
                if (childNodes.item(j).getNodeType() == Node.ELEMENT_NODE) {
                    // 获取节点
                    System.out.print(childNodes.item(j).getNodeName() + ":");
                    // 获取节点值
                    System.out.println(childNodes.item(j).getFirstChild().getNodeValue());
                }
            }
        }
    }

    // 用Node方式
    public static void node(NodeList list) {
        for (int i = 0; i < list.getLength(); i++) {
            Node node = list.item(i);
            NodeList childNodes = node.getChildNodes();
            for (int j = 0; j < childNodes.getLength(); j++) {
                if (childNodes.item(j).getNodeType() == Node.ELEMENT_NODE) {
                    System.out.print(childNodes.item(j).getNodeName() + ":");
                    System.out.println(childNodes.item(j).getFirstChild().getNodeValue());
                }
            }
        }
    }

    public static void main(String[] args) {
        // 1.创建DocumentBuilderFactory对象
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // 2.创建DocumentBuilder对象
        try {
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document d = builder.parse("src/book.xml");
            NodeList sList = d.getElementsByTagName("书");
            element(sList);// Element方式
            // node(sList);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果:

img

2.SAX


SAX 方式解析:以事件驱动的XML API,边扫描边解析,解析速度快占用内存少(逐行解析)。

SAX 解析 XML 的步骤:

  1. 创建 SAXParserFactory 的对象。

  2. 创建 SAXParser 对象(解析器)。

  3. 创建一个 DefaultHandler 的子类。

  4. 调用 parse 方法。

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SaxXmlDemo {

    public static void main(String[] args) throws Exception {
        // 1.或去SAXParserFactory实例
        SAXParserFactory factory = SAXParserFactory.newInstance();
        // 2.获取SAXparser实例
        SAXParser saxParser = factory.newSAXParser();
        // 3.创建DefaultHandler对象
        SAXDemoHandler handler = new SAXDemoHandler();
        // 4.调用parse()方法
        saxParser.parse("src/book.xml", handler);
    }
}

class SAXDemoHandler extends DefaultHandler {
    // 遍历xml文件开始标签
    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
        System.out.println("sax解析开始");
    }

    // 遍历xml文件结束标签
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
        System.out.println("sax解析结束");
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        if (qName.equals("书")) {
            System.out.println("============开始遍历=============");
        } else if (!qName.equals("书") && !qName.equals("书架")) {
            System.out.print("节点名称:" + qName); // 输出节点名称
            for (int i = 0; i < attributes.getLength(); i++) {
                System.out.print(", 属性:" + attributes.getQName(i) + "=" + attributes.getValue(i));
            }
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        if (qName.equals("书")) {
            System.out.println(qName + ":遍历结束");
            System.out.println("============结束遍历============");
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        String value = new String(ch, start, length).trim();
        if (!value.equals("")) {
            System.out.println(", 节点内容:" + value); // 输出节点内容
        }
    }
}

运行结果:

img

3.JDOM


JDOM 解析:是一种解析XML的JAVA工具包,是基于树形结构,利用纯JAVA技术对XML文档实现解析,只适用于JAVA语言。

JDOM解析XML的步骤:

  1. 创建一个 SAXBuilder 对象。

  2. 调用 build 方法,得到 Document 对象(通过 IO 流)。

  3. 获取根节点。

  4. 获取根节点的直接子节点的集合。

  5. 遍历集合。

到 http://www.jdom.org/downloads/index.html 下载jar包,有1.1.3和2.0.6两个,我们下载,复制到项目的lib目录中,右键添加的Build Path中。

img

img

img

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;

import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;

public class JdomXmlDemo {

    public static void main(String[] args) throws Exception {
        // 1.创建SAXBuilder对象
        SAXBuilder saxBuilder = new SAXBuilder();
        // 2.创建输入流
        InputStream is = new FileInputStream(new File("src/book.xml"));
        // 3.将输入流加载到build中
        Document document = saxBuilder.build(is);
        // 4.获取根节点
        Element rootElement = document.getRootElement();
        // 5.获取子节点
        List<Element> children = rootElement.getChildren();
        for (Element child : children) {
            List<Attribute> attributes = child.getAttributes();
            // 打印属性
            for (Attribute attr : attributes) {
                System.out.println(attr.getName() + ":" + attr.getValue());
            }
            List<Element> childrenList = child.getChildren();
            System.out.println("======获取子节点-start======");
            for (Element e : childrenList) {
                System.out.println("节点名:" + e.getName() + ", 节点值:" + e.getValue());
                List<Attribute> childAttributes = e.getAttributes();
                for (Attribute attr : childAttributes) {
                    System.out.println(attr.getName() + "=" + attr.getValue());
                }
            }
            System.out.println("======获取子节点-end======");
        }
    }

}

运行结果:

img

4.DOM4j


DOM4J :DOM4J是一个JAVA的XML API,JDOM的升级版。

DOM4J 解析 XML 的步骤:

  1. 创建 SAXReader 对象。

  2. 调用 read 方法。

  3. 获取根元素。

  4. 通过迭代器遍历直接节点。

通常使用Dom4j工具进行XML的DOM解析,首先要到Dom4j的官网https://dom4j.github.io/下载包并加载到IDE开发工具中(例如eclipse)

import java.io.File;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class Dom4jXmlDemo {

    public static void main(String[] args) throws Exception {
        // 1.创建Reader对象
        SAXReader reader = new SAXReader();
        // 2.加载xml
        Document document = reader.read(new File("src/book.xml"));
        // 3.获取根节点
        Element rootElement = document.getRootElement();
        Iterator iterator = rootElement.elementIterator();
        while (iterator.hasNext()) {
            Element child = (Element) iterator.next();
            List<Attribute> attributes = child.attributes();
            System.out.println("======获取属性值-start======");
            for (Attribute attribute : attributes) {
                System.out.println(attribute.getValue());
            }
            System.out.println("======获取属性值-end======");
            System.out.println("======遍历子节点-start======");
            Iterator childIterator = child.elementIterator();
            while (childIterator.hasNext()) {
                Element e = (Element) childIterator.next();
                System.out.println("节点名:" + e.getName() + ",节点值:" + e.getStringValue());
                List<Attribute> childAttributes = e.attributes();
                for (Attribute attr : childAttributes) {
                    System.out.println(attr.getName() + "=" + attr.getValue());
                }
            }
            System.out.println("======遍历子节点-end======");
        }
    }
}

img

四种解析 XML 的特点:


1.DOM 解析:

形成了树结构,有助于更好的理解、掌握,且代码容易编写。解析过程中,树结构保存在内存中,方便修改。

2.SAX 解析:

采用事件驱动模式,对内存耗费比较小。适用于只处理 XML 文件中的数据时。

3.JDOM 解析:

仅使用具体类,而不使用接口。API 大量使用了 Collections 类。

4.DOM4J解析:

使用接口和抽象基本类方法。性能优异,灵活性好,功能强大和易于使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值