java解析XML详解

Java解析XML详解

XML 概述

XML(Extensible Markup Language) 是一种标记语言,用于存储和传输数据。XML 文档由许多元素构成,每个元素包含一个开始标签、一个结束标签和其中间的一些内容。

XML 和 HTML 最大的不同在于,XML 的标签是自定义的,因此具有更强的灵活性和可扩展性。XML 通常用于将数据从一种格式转换为另一种格式,并用于各种应用程序之间的数据交换。

Java 解析 XML

Java 通过许多 API 来解析 XML 文档。本文将介绍两种最常用的 API:

  1. JAXP(Java API for XML Processing)

JAXP 是 Java 中用于处理 XML 的标准 API,它提供了解析器和文档对象模型(DOM)。

  1. SAX(Simple API for XML)

SAX 是 Java 中另一种解析 XML 的 API,它是一种基于事件驱动的解析器。相比于 DOM,它更适合处理大型文档,因为它不需要将整个文档加载到内存中。

JAXP 解析 XML

解析 XML 文档步骤

  1. 获取一个 javax.xml.parsers.DocumentBuilderFactory 的实例。
  2. 通过 DocumentBuilderFactory 创建一个 javax.xml.parsers.DocumentBuilder 实例。
  3. 通过 DocumentBuilder 的 parse() 方法解析 XML 文档。
  4. 通过 DOM 解析 XML 文档并操作元素。

示例

假设有如下 XML 文档:

<catalog>
  <book id="bk101">
    <author>Gambardella, Matthew</author>
    <title>XML Developer's Guide</title>
    <genre>Computer</genre>
    <price>44.95</price>
    <publish_date>2000-10-01</publish_date>
    <description>An in-depth look at creating applications 
      with XML.</description>
  </book>
  <book id="bk102">
    <author>Ralls, Kim</author>
    <title>Midnight Rain</title>
    <genre>Fantasy</genre>
    <price>5.95</price>
    <publish_date>2000-12-16</publish_date>
    <description>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.</description>
  </book>
</catalog>

使用 JAXP 解析 XML 文档的代码如下:

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

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

import java.io.File;

public class JAXPExample {
  public static void main(String[] args) throws Exception {
    File xmlFile = new File("example.xml");

    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
    Document doc = dBuilder.parse(xmlFile);

    doc.getDocumentElement().normalize();

    NodeList bookList = doc.getElementsByTagName("book");

    for (int i = 0; i < bookList.getLength(); i++) {
      Element book = (Element) bookList.item(i);

      String id = book.getAttribute("id");
      String author = book.getElementsByTagName("author").item(0).getTextContent();
      String title = book.getElementsByTagName("title").item(0).getTextContent();
      String genre = book.getElementsByTagName("genre").item(0).getTextContent();
      double price = Double.parseDouble(book.getElementsByTagName("price").item(0).getTextContent());
      String publishDate = book.getElementsByTagName("publish_date").item(0).getTextContent();
      String description = book.getElementsByTagName("description").item(0).getTextContent();

      System.out.println(String.format("Book %s:%nAuthor: %s%nTitle: %s%nGenre: %s%nPrice: %s%nPublish Date: %s%nDescription: %s%n",
          id, author, title, genre, price, publishDate, description));
    }
  }
}

运行该程序后,结果如下:

Book bk101:
Author: Gambardella, Matthew
Title: XML Developer's Guide
Genre: Computer
Price: 44.95
Publish Date: 2000-10-01
Description: An in-depth look at creating applications 
      with XML.

Book bk102:
Author: Ralls, Kim
Title: Midnight Rain
Genre: Fantasy
Price: 5.95
Publish Date: 2000-12-16
Description: A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.

SAX 解析 XML

解析 XML 文档步骤

  1. 创建一个 SAXParserFactory 的实例。
  2. 通过 SAXParserFactory 创建一个 SAXParser 的实例。
  3. 创建自己的 SAX Handler 类继承 DefaultHandler。
  4. 通过 SAXParser 的 parse() 方法解析 XML 文档。
  5. 在 SAX Handler 类中实现处理 XML 元素的方法。

示例

使用 SAX 解析 XML 文档的代码如下:

import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.SAXException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.IOException;

public class SAXExample extends DefaultHandler {
  boolean bAuthor = false;
  boolean bTitle = false;
  boolean bGenre = false;
  boolean bPrice = false;
  boolean bPublishDate = false;
  boolean bDescription = false;

  @Override
  public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    if (qName.equalsIgnoreCase("book")) {
      String id = attributes.getValue("id");
      System.out.println(String.format("Book %s:", id));
    } else if (qName.equalsIgnoreCase("author")) {
      bAuthor = true;
    } else if (qName.equalsIgnoreCase("title")) {
      bTitle = true;
    } else if (qName.equalsIgnoreCase("genre")) {
      bGenre = true;
    } else if (qName.equalsIgnoreCase("price")) {
      bPrice = true;
    } else if (qName.equalsIgnoreCase("publish_date")) {
      bPublishDate = true;
    } else if (qName.equalsIgnoreCase("description")) {
      bDescription = true;
    }
  }

  @Override
  public void endElement(String uri, String localName, String qName) throws SAXException {
  }

  @Override
  public void characters(char[] ch, int start, int length) throws SAXException {
    if (bAuthor) {
      System.out.println(String.format("Author: %s", new String(ch, start, length)));
      bAuthor = false;
    } else if (bTitle) {
      System.out.println(String.format("Title: %s", new String(ch, start, length)));
      bTitle = false;
    } else if (bGenre) {
      System.out.println(String.format("Genre: %s", new String(ch, start, length)));
      bGenre = false;
    } else if (bPrice) {
      System.out.println(String.format("Price: %s", Double.parseDouble(new String(ch, start, length))));
      bPrice = false;
    } else if (bPublishDate) {
      System.out.println(String.format("Publish Date: %s", new String(ch, start, length)));
      bPublishDate = false;
    } else if (bDescription) {
      System.out.println(String.format("Description: %s", new String(ch, start, length)));
      bDescription = false;
    }
  }

  public static void main(String[] args) throws Exception {
    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser saxParser = factory.newSAXParser();
    SAXExample handler = new SAXExample();
    saxParser.parse("example.xml", handler);
  }
}

运行该程序后,结果如下:

Book bk101:
Author: Gambardella, Matthew
Title: XML Developer's Guide
Genre: Computer
Price: 44.95
Publish Date: 2000-10-01
Description: An in-depth look at creating applications 
      with XML.

Book bk102:
Author: Ralls, Kim
Title: Midnight Rain
Genre: Fantasy
Price: 5.95
Publish Date: 2000-12-16
Description: A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java解析XML详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java迭代器与Collection接口超详细讲解

    Java迭代器与Collection接口超详细讲解 什么是Java迭代器? Java中的迭代器是一种访问集合元素的方式,它提供了一种遍历集合的统一方法,可以不用关心底层集合的实现。迭代器可以依次访问集合中的每个元素,并且支持在遍历过程中进行元素的删除操作。 Java中的迭代器是通过java.util.Iterator接口实现的。Iterator接口实际上是一…

    Java 2023年5月26日
    00
  • Java Scanner用法案例详解

    Java Scanner用法案例详解 什么是Scanner类 Scanner类是一个标准的Java类,位于java.util包中。它提供了一种方便而且简单的方式用于读取用户输入的数据,例如,从键盘上读取数据。 Scanner类构造方法 Scanner类有以下几种构造方法: Scanner(File source):用于读取文件。 Scanner(InputS…

    Java 2023年5月26日
    00
  • java基础入门之IO流

    Java基础入门之IO流 本文主要介绍Java IO流的基础知识,包括IO流的概述、IO流分类、IO流的读取和写入操作以及常用IO流示例。 IO流概述 Java IO(Input/Output)流是一种用于处理输入/输出的机制。它提供了一种操作任意数据源的方式,包括磁盘文件、网络连接等等。 Java IO流由四个抽象类组成: InputStream:字节输入…

    Java 2023年5月26日
    00
  • 教你用Java实现RSA非对称加密算法

    教你用Java实现RSA非对称加密算法 什么是RSA算法? RSA是一种非对称加密算法,也就是说它需要两个不同的密钥:公钥和私钥。公钥可以用来加密数据,私钥用来解密数据,因为私钥是不公开的,所以数据只能被私钥的拥有者解密。 RSA算法的原理是基于大数分解难题,即将一个大的数分解成为两个质数的乘积的难度,因为在目前计算机的技术水平下,对于一段非常长的质数的乘积…

    Java 2023年5月26日
    00
  • Java线程安全与非线程安全解析

    Java线程安全与非线程安全解析 Java的线程安全问题是非常重要的一个主题,尤其是在多线程程序的开发中。本文将从线程安全和非线程安全的概念入手,深入探讨Java线程安全与非线程安全的区别,并以代码示例详细说明。 线程安全与非线程安全 Java中的线程安全问题可以简单理解为多线程同时访问同一块内存时所出现的问题。如果多个线程并发地访问同一块内存时,程序仍然能…

    Java 2023年5月19日
    00
  • SpringMVC实战案例RESTFul实现添加功能

    SpringMVC实战案例RESTFul实现添加功能 在SpringMVC中,我们可以使用RESTful风格的API来实现添加功能。本文将详细讲解如何在SpringMVC中实现RESTful添加功能。 RESTful风格的API RESTful是一种Web API的设计风格,它使用HTTP协议的GET、POST、PUT、DELETE等方法来实现资源的增删改查…

    Java 2023年5月18日
    00
  • 配置Web应用环境实现JSP留言簿

    下面给出配置Web应用环境实现JSP留言簿的完整攻略。 环境准备 在进行Web应用环境配置之前,需要先准备好以下环境: 安装Java开发环境(JDK) 安装Tomcat服务器 安装一个Java IDE(Eclipse、IntelliJ等) 创建Web应用项目 首先,需要在Java IDE中创建一个Web应用项目。以Eclipse为例,创建步骤如下: 打开Ec…

    Java 2023年6月2日
    00
  • 超细致讲解Spring框架 JdbcTemplate的使用

    下面我将为您详细讲解“超细致讲解Spring框架 JdbcTemplate的使用”的完整攻略。 一、什么是JdbcTemplate JdbcTemplate是Spring框架提供的一个非常重要的特性,它是一个基于JDBC(Java数据库连接)的模板类,封装了JDBC的许多繁琐操作,使得开发者可以更加轻松便捷地操作数据库。同时,JdbcTemplate在执行S…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部