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如何取掉json数据中值为null的属性字段

    当在处理JSON数据时,我们可能会遇到一些值为null的属性字段,而它们并不是我们所需的数据,因此需要将其取掉。 下面给出Java取掉JSON中值为null的属性字段的完整攻略: 使用Jackson库进行JSON处理 Jackson库是一种常用的Java库,它提供了许多处理JSON数据的方法。我们可以使用Jackson库读取JSON字符串并将其转换为Java…

    Java 2023年5月26日
    00
  • Java实现简单树结构

    下面我来详细讲解“Java实现简单树结构”的完整攻略。 什么是树结构? 树结构是一种经典的数据结构,它是由节点和边组成的层次结构。树结构中有一个顶点叫做根节点,其他节点则称作子节点。树结构具有以下特点: 根节点没有父节点; 每个节点都可能有若干个子节点; 除了根节点外,每个节点都有唯一一个父节点; 如果一个节点没有子节点,我们称其为叶节点。 如何实现树结构?…

    Java 2023年5月18日
    00
  • SpringBoot 中常用注解及各种注解作用

    来详细讲解一下SpringBoot中常用注解及各种注解作用的攻略。 1. @SpringBootApplication 这是一个复合注解,包含了@Configuration、@EnableAutoConfiguration和@ComponentScan三个注解。 @Configuration:表示这是一个配置类,可以用来替代xml配置文件。 @EnableA…

    Java 2023年5月15日
    00
  • Spring Security如何在Servlet中执行

    Spring Security 是 Spring 框架中的一个安全框架,可以用于保护 Web 应用程序的安全,包括身份验证、授权、防止攻击等功能。在 Servlet 中使用 Spring Security 可以有效地保护应用程序的安全,下面是详细的使用攻略。 1. 添加 Spring Security 依赖 首先,需要在项目中添加 Spring Securi…

    Java 2023年5月20日
    00
  • 微信小程序仿知乎实现评论留言功能

    下面我将为您详细讲解“微信小程序仿知乎实现评论留言功能”的完整攻略。 一、前置知识和准备工作 在开始编写代码前,需要准备好以下工具和知识: 微信开发者工具:用于开发和调试微信小程序,可在微信公众平台下载并安装。 知乎API:用于获取知乎的相关数据,需要向知乎开放平台申请。 Markdown渲染库:用于将知乎中的Markdown格式的文本转化成小程序可显示的格…

    Java 2023年5月23日
    00
  • JPA如何设置表名和实体名,表字段与实体字段的对应

    JPA(Java Persistence API)是Java EE技术规范之一,主要用于ORM(Object-relational mapping)操作。在使用JPA时,有时需要设置表名和实体名,以及将表字段与实体字段对应,本文将为您提供设置表名和实体名、表字段与实体字段对应的完整攻略,本文中所有示例代码均使用Hibernate实现JPA。 设置表名和实体名…

    Java 2023年5月20日
    00
  • Java SpringBoot+vue+实战项目详解

    Java SpringBoot+Vue实战项目,可以分为后端和前端两个部分。下面将详细讲解如何使用SpringBoot和Vue来创建一个完整的Web应用程序。 后端SpringBoot SpringBoot是一个用于快速开发基于Spring框架的Web应用程序的开源框架。下面将详细讲解如何使用SpringBoot来创建一个完整的Web应用程序。 步骤1:创建…

    Java 2023年5月19日
    00
  • 解决JMap抓取heap使用统计信息报错的问题

    下面我就来详细讲解如何解决JMap抓取heap使用统计信息报错的问题。 背景 在使用JMap命令抓取Java应用程序Heap使用统计信息时,可能会遇到以下报错信息: Error: Unable to perform heap dump on unreachable object 该错误通常表示JMap已经找不到对应的对象,导致无法进行Heap Dump操作。…

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