java解析XML详解

yizhihongxing

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日

相关文章

  • JSP常用七大动作指令实例解析

    下面我来为您介绍“JSP常用七大动作指令实例解析”的完整攻略。 什么是JSP动作指令 JSP动作指令是一种特殊的标记,用于在JSP页面中指定特定的处理操作。每个指令都有一个特定的功能,并且在JSP页面的不同部分中使用。JSP标准标签库(JSTL)和自定义标签库都是由JSP动作指令实现的。 JSP常用七大动作指令 1. <%@ page %>指令 …

    Java 2023年6月15日
    00
  • 详解Java事件编程的使用

    详解Java事件编程的使用 什么是Java事件编程? 在Java编程中,事件是指程序或用户可以监测到并有可能做出反应的操作或通知。Java事件编程是基于事件模型的一种编程方法,也是一种事件驱动的编程方式。 事件驱动编程的核心在于将程序设计为一个能够响应特定事件的系统。在这种模式下,程序设计者无需关注具体的事件何时发生,只需要定义如何响应事件即可。 Java事…

    Java 2023年5月23日
    00
  • Java实现无损Word转PDF的示例代码

    下面是详细讲解“Java实现无损Word转PDF的示例代码”的完整攻略。 1. 准备工作 在开始转换 Word 文档为 PDF 文件之前,需要进行一些准备工作: 安装相应的 Java 开发环境 引入相应的依赖库 将需要转换为 PDF 的 Word 文档准备好 2. 示例代码1 – 使用Apache POI进行文档转换 import java.io.File;…

    Java 2023年5月19日
    00
  • PHP实现QQ空间自动回复说说的方法

    PHP实现QQ空间自动回复说说的方法 简介 在 PHP 中,可以通过调用第三方库实现登录QQ空间并发布评论、回复的功能。本文将介绍如何使用 PHP 向指定好友的说说进行自动回复。 整体思路 通过 QQ 登录,查找到指定好友的说说,获取说说的ID。通过模拟请求,向该说说增加回复。 具体来讲,可以分为以下步骤: 1.模拟登录 QQ 空间,获取 session、c…

    Java 2023年6月16日
    00
  • Java之BigDecimal实现详解

    Java之BigDecimal实现详解 简介 在Java中,float和double类型的数值在进行计算时,会有精度丢失的问题。例如,当两个小数相加时,结果可能会出现偏差,导致计算结果不准确。而BigDecimal类就是专门为高精度计算而设计的一个类。 BigDecimal是不可变的(immutable)的、高精度的(arbitrary-precision)…

    Java 2023年5月18日
    00
  • 非常实用的Tomcat启动脚本实现方法

    非常实用的Tomcat启动脚本实现方法 在Linux环境下,通常我们会使用启动脚本的方式来启动Tomcat。而对于初学者来说,编写一个完整可靠的启动脚本不是一件容易的事情。本文将介绍一种非常实用的Tomcat启动脚本实现方法,帮助大家快速实现Tomcat的自动启动、关闭、查看状态等操作。 Step 1: 创建启动脚本 首先,我们需要创建一个启动脚本。为了让脚…

    Java 2023年5月19日
    00
  • Java中间消息件ActiveMQ使用实例

    下面我来详细地讲解一下“Java中间消息件ActiveMQ使用实例”的完整攻略。 什么是ActiveMQ ActiveMQ是Apache下的一个开源项目,它实现了JMS规范,提供了消息收发的功能。ActiveMQ支持多种协议,包括TCP, SSL, NIO, UDP等等,因此可以很容易地集成到各种不同的应用中。 ActiveMQ的安装和配置 ActiveMQ…

    Java 2023年5月20日
    00
  • Java女装商城系统的实现流程

    实现Java女装商城系统需要经过以下流程: 1. 确定需求 首先需要明确女装商城系统需要实现哪些功能,包括但不限于商品展示、购物车管理、订单管理、用户中心、支付接口等。根据需求可以确定整个系统的框架和功能模块。 示例说明1:商城系统需要具有商品分类、品牌、价格、尺码等筛选条件,这就需要对商品信息进行标准化和分类,以方便用户进行检索。 示例说明2:商城系统需要…

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