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日

相关文章

  • SpringBoot集成Shiro进行权限控制和管理的示例

    下面我来详细讲解“SpringBoot集成Shiro进行权限控制和管理的示例”的完整攻略。 什么是 Shiro Apache Shiro 是一个功能强大且易于使用的 Java 安全框架,提供身份验证、授权、加密等功能,可以轻松地保护应用程序的安全与隐私。 SpringBoot 集成 Shiro 下面是 SpringBoot 集成 Shiro 进行权限控制和管…

    Java 2023年6月15日
    00
  • Java web数据可视化实现原理解析

    下面我会详细讲解“Java web数据可视化实现原理解析”的完整攻略。 Java web数据可视化实现原理解析 什么是数据可视化 数据可视化顾名思义就是将数据以可视化的方式展示出来,如图表、图像、地图等形式,以便更加直观地理解数据。在企业、政府等管理领域,数据可视化已经成为了非常重要的工具。 Java web实现数据可视化的原理 Java web实现数据可视…

    Java 2023年5月19日
    00
  • 浅谈Java程序运行机制及错误分析

    浅谈Java程序运行机制及错误分析 Java程序的基本运行机制 Java程序的运行过程主要包含编译和执行两个阶段。 编译阶段 将.java文件通过编译器编译生成同名的.class文件。 在编译过程中,编译器会检查代码的语法、类型等问题,如果存在问题会报错并停止编译。 如果编译成功,会生成一个.class文件,它包含了字节码指令以及相关的元数据信息。 示例1:…

    Java 2023年5月26日
    00
  • Spring Data Jpa的四种查询方式详解

    下面是关于“Spring Data Jpa的四种查询方式详解”的完整攻略: Spring Data Jpa的四种查询方式详解 Spring Data Jpa是一个简化了JPA规范的框架,它提供了许多便利的功能,其中最重要的就是提供了四种查询方式。 命名查询 命名查询是指根据方法名进行查询。Spring Data Jpa会根据方法名的规则自动生成查询语句,无需…

    Java 2023年5月20日
    00
  • java门禁系统面向对象程序设计

    Java门禁系统面向对象程序设计的攻略如下: 1.系统需求分析 在进行Java门禁系统的设计之前,需要对系统的需求进行分析,包括基本功能、用户需求、系统限制等,从而有针对性地设计程序。 2.系统设计 在完成需求分析后,可以开始设计系统,包括系统架构、类的设计、模块的分配等,充分考虑系统的可扩展性、可维护性等方面,尽量使系统的设计更加合理化。 3.系统实现 实…

    Java 2023年5月24日
    00
  • 简单测试Apache是如何完成负载均衡策略配置

    下面是“简单测试Apache如何完成负载均衡策略配置”的完整攻略,主要分为以下几个步骤: 步骤一:安装Apache 安装Apache可以使用Linux系统默认的包管理工具,如yum、apt等,也可以去Apache官网下载最新版本的源码包进行编译安装。这里以CentOS7系统为例,使用yum进行安装: yum install httpd 步骤二:安装模块 安装…

    Java 2023年6月15日
    00
  • SpringBoot+Hibernate实现自定义数据验证及异常处理

    下面将为您讲解“SpringBoot+Hibernate实现自定义数据验证及异常处理”的完整攻略。 一、概述 在一个Web应用中,对用户提交的数据进行数据验证和异常处理是非常重要的。本文将介绍如何使用SpringBoot和Hibernate实现自定义的数据验证及异常处理。 二、自定义数据验证 1. Hibernate validator 在SpringBoo…

    Java 2023年5月20日
    00
  • java数组输出的实例代码

    下面我将为您详细讲解“Java数组输出的实例代码”的完整攻略,包含以下内容: 数组的定义与初始化 数组元素的访问和输出 示例说明 数组的定义与初始化 在Java中,定义数组需要指定数组的类型和数组的大小,格式如下: 数据类型[] 数组名 = new 数据类型[数组大小]; 其中,数据类型可以为Java中的任意基本数据类型或引用类型,数组大小为正整数。 例如,…

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