【JAVA基础】-JAVA开发中XML解析多种方法

简介: 【JAVA基础】-JAVA开发中XML解析多种方法

【JAVA基础】-JAVA开发中XML解析多种方法

1、什么是XML

XML是可扩展标记语言(Extensible Markup Language)是一种标记语言,是从标准通用标记语言(SGML)中简化修改而来,它主要用到的有可扩展标记语言、可扩展式语言(XSL)、XBRL和XPath等。

XML设计用来传输和存储数据,而不是显示数据。

2、本文操作所用XML示例

<?xml version="1.0" encoding="UTF-8"?>
<street>
    <code>110101001</code>
    <name>东华门街道办事处</name>
    <areaCode>110101</areaCode>
    <provinceCode>11</provinceCode>
    <cityCode>1101</cityCode>
</street>

如上示例使用简单的具有自我描述性的语法,第一行是XML声明。它定义XML的版本(1.0)和所使用的编码(UTF-8),描述文档的根元素。XML文档必须包含根元素,该元素是所有其他元素的父元素。XML文档是一个文档树,从根部开始,并扩展到树的最底部。具体如下图:

3、DOM解析XML文件

JAVA官方提供通过DOM实现对XML文件读取。DOM读取XML文件原理是:将整个XML文件预加载完毕后,才进行解析,在JAVA程序中读取XML文件效率取决于XML文件大小。

Dom解析XML步骤

1.获取DocumentBuilderFactory

DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();

2.通过DocumentBuilderFactory产生一个DocumentBuilder

DocumentBuilder builder=factory.newDocumentBuilder();

3.利用DocumentBuilder的parser方法加载xml创建对象Document

Document dument=builder.parse(new File("street.xml"));

4.解析XML文件属性名和属性值

NodeList nodeList = document.getElementsByTagName("book");
Node node = nodeList.item(i);
NamedNodeMap nameNodeMap = node.getAttributes();
Node attr = nameNodeMap.item(i);
//获取属性名
String nodeName = attr.getNodeName();
//获取属性值
String nodeValue = attr.getNodeValue();

5.解析XML文件的节点名和节点值

NodeList nodeList=document.getChildNodes();
Node node = node.item(i);
//获取element类型element类型节点的节点值
String nodeName  = node.getNodeName();
//获取element类型值
String nodeValue = node.getTextContent();

Dom解析XML示例代码

public void readXmlByDocument() throws Exception {
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
     DocumentBuilder builder = factory.newDocumentBuilder();
     Document document = builder.parse(new File("street.xml"));
     Element root = document.getDocumentElement();
     NodeList nodeList = root.getChildNodes();
     int len = nodeList.getLength();
     for (int i = 0; i < len; i++) {
        Node node = nodeList.item(i);
        String nodeName = node.getNodeName();
        String localName = node.getLocalName();
        System.out.println(nodeName);
     }
 }

4、JDOM解析XML文件

meaven引用依赖

<dependency>
     <groupId>org.jdom</groupId>
     <artifactId>jdom2</artifactId>
     <version>2.0.6</version>
</dependency>

JDOM解析XML步骤

1.创建SAXBuilder对象

SAXBuilder saxBuilder = new SAXBuilder();

2.调用build方法获得Document对象

Document document = saxBuilder.build(new FileInputStream("street.xml"));

3.获取根节点

Element root = document.getRootElement();

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

List<Element> children = root.getChildren();

5.遍历节点集合

for (Element element: children) {}

JDOM解析XML示例代码

public void readXmlByJDom() throws Exception{
    SAXBuilder builder = new SAXBuilder();
    Document document = builder.build(new File("street.xml"));
    Element root = document.getRootElement();
    List<Element> children = root.getChildren();
    for (Element element: children) {
        String elementName= element.getName();
        String elementText =element.getText();
        System.out.println(elementName);
        System.out.println(elementText);
   }
}

5、Dom4j解析XML文件

meaven引用依赖

<dependency>
    <groupId>dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>1.1</version>
     <scope>test</scope>
 </dependency>

Dom4j解析XML步骤

1.创建SAXReader对象

SAXReader reader=new SAXReader();

2.调用SAXReader的read方法加载XML文件并创建Document对象

Document document = reader.read(new File("street.xml"));

3.通过Document的方法getRootElement获取根结点

Element root = document.getRootElement();

4.获取子节点值

String nameText = root.elementText("name");

Dom4j解析XML示例

public void readXMLJDom4() throws Exception{
    SAXReader reader=new SAXReader();
    Document document = reader.read(new File("street.xml"));
    Element root = document.getRootElement();
    QName qName = root.getQName();
    String name = qName.getName();
    String name1 = root.getName();
    String nameText = root.elementText("name");
    System.out.println(nameText);
}

6、SAX读取并解析XML文件

Sax读取原理:Sax对xml文件的读取是采用事件机制的,当某事件发生时,会自动触发定义好的事件处理方法。基本的事件有:Document,Element,characters三种最基本的事件。

Dom4j解析XML步骤

方式一:

1.创建SAXParserFactory 通过SAXParserFactory.newInstance();

SAXParserFactory factory=SAXParserFactory.newInstance();

2.通过SAXParser.newSAXParser()创建SAXParser的实例对象;

SAXParser parser = factory.newSAXParser();

3.获取处理类,创建一个继承于DefaultHandler的累,并重写读取xml方法;

StreetHandle handler =new StreetHandle();
parser.parse(new File("street.xml"),handler);

4.进行解析,通过SAXParser.parse方法进行解析;

方法二:

1.创建SAXParserFactory 通过SAXParserFactory.newInstance();

SAXParserFactory spf = SAXParserFactory.newInstance();

2.通过SAX解析工厂得到解析器对象

SAXParser sp = spf.newSAXParser();

3.通过解析器对象得到一个XML的读取器

XMLReader xmlReader = sp.getXMLReader();

4.设置读取器的事件处理器

xmlReader.setContentHandler(new BookParserHandler());

5.解析XML文件

xmlReader.parse("street.xml")
  • SAX读取并解析XML示例
  • 创建Handle类
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.util.ArrayList;
import java.util.List;
public class StreetHandle extends DefaultHandler {
    public List<Street> list = new ArrayList<Street>();
    Street street = null;
    StringBuilder sb = null;
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        System.out.println(localName);
        if("street".equals(qName)){
            street=new Street();
            String name = attributes.getValue("name");
            street.setName(name);
            list.add(street);
        }
    }
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        System.out.println("characters->" + new String(ch, start, length));
    }
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        System.out.println("endElement->" + localName);
    }
}
  • SAX解析实例
public void readXmlSAX() throws Exception {
    SAXParserFactory factory=SAXParserFactory.newInstance()
    SAXParser parser = factory.newSAXParser();
    StreetHandle handler =new StreetHandle();
    parser.parse(new File("street.xml"),handler);
    List<Street> list=handler.list;
    System.out.println("readXMLSAX");
    System.out.println(list.size());
}

7、总结

读取并解析XML有上面4种方案,根据不同的应用场合,使用恰当的方法。

DOM解析:一次性把XML文档内容加载到内存,构建Document对象。

  1. 不适合读取大容量的xml文件;
  2. Dom解析可以随意读取,甚至往回读取;
  3. Dom解析可以实现增删改查;

常用解析工具:Dom4j

SAX解析:读取一点,解析一点。

  1. 适合读取大容量的xml文件;
  2. 从上往下逐点读取,不能往回读;
  3. SAX解析通常只读取文件,不能对文件进行操作;

目录
相关文章
|
1月前
|
Java
Java的CAS机制深度解析
CAS(Compare-And-Swap)是并发编程中的原子操作,用于实现多线程环境下的无锁数据同步。它通过比较内存值与预期值,决定是否更新值,从而避免锁的使用。CAS广泛应用于Java的原子类和并发包中,如AtomicInteger和ConcurrentHashMap,提升了并发性能。尽管CAS具有高性能、无死锁等优点,但也存在ABA问题、循环开销大及仅支持单变量原子操作等缺点。合理使用CAS,结合实际场景选择同步机制,能有效提升程序性能。
|
17天前
|
机器学习/深度学习 JSON Java
Java调用Python的5种实用方案:从简单到进阶的全场景解析
在机器学习与大数据融合背景下,Java与Python协同开发成为企业常见需求。本文通过真实案例解析5种主流调用方案,涵盖脚本调用到微服务架构,助力开发者根据业务场景选择最优方案,提升开发效率与系统性能。
157 0
|
12天前
|
Java 开发者
Java并发编程:CountDownLatch实战解析
Java并发编程:CountDownLatch实战解析
291 100
|
2月前
|
存储 缓存 Java
Java数组全解析:一维、多维与内存模型
本文深入解析Java数组的内存布局与操作技巧,涵盖一维及多维数组的声明、初始化、内存模型,以及数组常见陷阱和性能优化。通过图文结合的方式帮助开发者彻底理解数组本质,并提供Arrays工具类的实用方法与面试高频问题解析,助你掌握数组核心知识,避免常见错误。
|
2月前
|
缓存 安全 Java
Java并发性能优化|读写锁与互斥锁解析
本文深入解析Java中两种核心锁机制——互斥锁与读写锁,通过概念对比、代码示例及性能测试,揭示其适用场景。互斥锁适用于写多或强一致性场景,读写锁则在读多写少时显著提升并发性能。结合锁降级、公平模式等高级特性,助你编写高效稳定的并发程序。
141 0
|
7天前
|
Java 开发者
Java 函数式编程全解析:静态方法引用、实例方法引用、特定类型方法引用与构造器引用实战教程
本文介绍Java 8函数式编程中的四种方法引用:静态、实例、特定类型及构造器引用,通过简洁示例演示其用法,帮助开发者提升代码可读性与简洁性。
|
17天前
|
安全 Java API
Java SE 与 Java EE 区别解析及应用场景对比
在Java编程世界中,Java SE(Java Standard Edition)和Java EE(Java Enterprise Edition)是两个重要的平台版本,它们各自有着独特的定位和应用场景。理解它们之间的差异,对于开发者选择合适的技术栈进行项目开发至关重要。
72 1
|
2月前
|
安全 Oracle Java
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
196 0
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
|
2月前
|
存储 缓存 算法
Java数据类型与运算符深度解析
本文深入解析Java中容易混淆的基础知识,包括八大基本数据类型(如int、Integer)、自动装箱与拆箱机制,以及运算符(如&与&&)的使用区别。通过代码示例剖析内存布局、取值范围及常见陷阱,帮助开发者写出更高效、健壮的代码,并附有面试高频问题解析,夯实基础。
|
2月前
|
算法 Java 测试技术
零基础学 Java: 从语法入门到企业级项目实战的详细学习路线解析
本文为零基础学习者提供完整的Java学习路线,涵盖语法基础、面向对象编程、数据结构与算法、多线程、JVM原理、Spring框架、Spring Boot及项目实战,助你从入门到进阶,系统掌握Java编程技能,提升实战开发能力。
116 0

推荐镜像

更多
  • DNS