JAVA解析XML

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:

在JAVA中最常用的解析xml的方式有四种,分别为:sax、dom、dom4j、jdom。sax方式的解析是基于事件的,比较适合大数据的解析,而dom的方式会将xml加载到内存中,构建出dom树,解析大文件时容易造成内存溢出,在实际开发中,我们应该选择最合适的解析方式。

假设我们有这样一个xml文件:

<xml>
   <userId><![CDATA[jianggujin]]></userId>
   <userName><![CDATA[蒋固金]]></userName>
   <birthday>1994-12-01</birthday>
</xml>

通过观察这段xml,我们可以将其抽象成一个实体类,取名为UserInfo

import java.text.MessageFormat;

public class UserInfo
{
   private String userId;
   private String userName;
   private String birthday;

   public String getUserId()
   {
      return userId;
   }

   public void setUserId(String userId)
   {
      this.userId = userId;
   }

   public String getUserName()
   {
      return userName;
   }

   public void setUserName(String userName)
   {
      this.userName = userName;
   }

   public String getBirthday()
   {
      return birthday;
   }

   public void setBirthday(String birthday)
   {
      this.birthday = birthday;
   }

   @Override
   public String toString()
   {
      return MessageFormat.format("[userId:{0},userName:{1},birthday:{2}]",
            userId, userName, birthday);
   }
}

为了使用方便,将这段xml抽出来放在一个接口中,这样就不需要每个解析类里面都写一遍了,只需要实现这个接口就行了。

public interface XMLContent
{
   public String XML = "<xml><userId><![CDATA[jianggujin]]></userId><userName><![CDATA[蒋固金]]></userName><birthday>1994-12-01</birthday></xml>";
}

接下来,将演示四种方式解析xml的简单示例。

sax方式

sax方式需要一个解析的处理器,继承自org.xml.sax.helpers.DefaultHandler
在DefaultHandler中,我们可能需要重写的方法有如下几个:

返回值 方法名 说明
void startDocument() 接收文档开始的通知
void startElement(String uri, String localName, String qName, Attributes attributes) 接收元素开始的通知
void characters(char[] ch, int start, int length) 接收元素中字符数据的通知
void endElement(String uri, String localName, String qName) 接收元素结束的通知
void endDocument() 接收文档结束的通知

使用示例:

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

/**
 * Sax解析XML
 * 
 * @author jianggujin
 * 
 */
public class SaxParser extends DefaultHandler implements XMLContent
{
   private UserInfo userInfo = null;
   private String currentTag = null;

   @Override
   public void startDocument() throws SAXException
   {
      userInfo = new UserInfo();
      System.out.println("startDocument...");
   }

   @Override
   public void startElement(String uri, String localName, String qName,
         Attributes attributes) throws SAXException
   {
      System.out.println("startElement...");
      currentTag = qName;
   }

   @Override
   public void characters(char[] ch, int start, int length) throws SAXException
   {
      System.out.println("characters...");
      String value = new String(ch, start, length);
      System.out.println(value);
      if ("userId".equals(currentTag))
      {
         userInfo.setUserId(value);
      }
      else if ("userName".equals(currentTag))
      {
         userInfo.setUserName(value);
      }
      else if ("birthday".equals(currentTag))
      {
         userInfo.setBirthday(value);
      }
   }

   @Override
   public void endElement(String uri, String localName, String qName)
         throws SAXException
   {
      System.out.println("endElement...");
      currentTag = null;
   }

   @Override
   public void endDocument() throws SAXException
   {
      System.out.println("endDocument...");
   }

   private UserInfo getUserInfo()
   {
      return userInfo;
   }

   public static UserInfo parse(InputStream inputStream) throws SAXException,
         ParserConfigurationException, IOException
   {
      XMLReader reader = SAXParserFactory.newInstance().newSAXParser()
            .getXMLReader();
      SaxParser handler = new SaxParser();
      reader.setContentHandler(handler);
      reader.parse(new InputSource(inputStream));
      return handler.getUserInfo();
   }

   public static UserInfo parse(String xml) throws SAXException,
         ParserConfigurationException, IOException
   {
      return parse(new ByteArrayInputStream(xml.getBytes("UTF-8")));
   }

   public static void main(String[] args) throws Exception
   {
      System.out.println(parse(XML));
   }
}

DOM方式

import java.io.ByteArrayInputStream;

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

import org.w3c.dom.Document;

/**
 * Dom方式解析XML
 * 
 * @author jianggujin
 * 
 */
public class DomParser implements XMLContent
{

   public static void main(String[] args) throws Exception
   {
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      DocumentBuilder builder = factory.newDocumentBuilder();
      Document document = builder.parse(new ByteArrayInputStream(XML
            .getBytes("UTF-8")));
      UserInfo userInfo = new UserInfo();
      userInfo.setUserId(document.getElementsByTagName("userId").item(0)
            .getTextContent());
      userInfo.setUserName(document.getElementsByTagName("userName").item(0)
            .getTextContent());
      userInfo.setBirthday(document.getElementsByTagName("birthday").item(0)
            .getTextContent());
      System.out.println(userInfo);
   }
}

DOM4j方式

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

/**
 * Dom4d方式解析XML
 * 
 * @author jianggujin
 * 
 */
public class Dom4jParser implements XMLContent
{

   public static void main(String[] args) throws Exception
   {
      Document document = DocumentHelper.parseText(XML);
      Element rootElement = document.getRootElement();

      UserInfo userInfo = new UserInfo();
      userInfo.setUserId(rootElement.elementText("userId"));
      userInfo.setUserName(rootElement.elementText("userName"));
      userInfo.setBirthday(rootElement.elementText("birthday"));
      System.out.println(userInfo);
   }
}

jDOM方式

import java.io.ByteArrayInputStream;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;

/**
 * JDom方式解析XML
 * 
 * @author jianggujin
 * 
 */
public class JDomParser implements XMLContent
{
   public static void main(String[] args) throws Exception
   {
      SAXBuilder builder = new SAXBuilder();
      Document document = builder.build(new ByteArrayInputStream(XML
            .getBytes("UTF-8")));
      Element rootElement = document.getRootElement();

      UserInfo userInfo = new UserInfo();
      userInfo.setUserId(rootElement.getChildText("userId"));
      userInfo.setUserName(rootElement.getChildText("userName"));
      userInfo.setBirthday(rootElement.getChildText("birthday"));
      System.out.println(userInfo);
   }
}

JAVA解析XML

目录
相关文章
|
4天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
|
4天前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
2天前
|
Java 程序员 开发者
Java中的异常处理机制深度解析
本文旨在深入探讨Java中异常处理的核心概念与实际应用,通过剖析异常的本质、分类、捕获及处理方法,揭示其在程序设计中的关键作用。不同于常规摘要,本文将直接切入主题,以简明扼要的方式概述异常处理的重要性及其在Java编程中的应用策略,引导读者快速把握异常处理的精髓。
|
4天前
|
存储 监控 算法
Java中的内存管理与垃圾回收机制解析
本文深入探讨了Java编程语言中的内存管理策略和垃圾回收机制。首先介绍了Java内存模型的基本概念,包括堆、栈以及方法区的划分和各自的功能。进一步详细阐述了垃圾回收的基本原理、常见算法(如标记-清除、复制、标记-整理等),以及如何通过JVM参数调优垃圾回收器的性能。此外,还讨论了Java 9引入的接口变化对垃圾回收的影响,以及如何通过Shenandoah等现代垃圾回收器提升应用性能。最后,提供了一些编写高效Java代码的实践建议,帮助开发者更好地理解和管理Java应用的内存使用。
|
5天前
|
Java 开发者
深入解析Java中的异常处理机制
本文将深入探讨Java中异常处理的核心概念和实际应用,包括异常的分类、捕获、处理以及最佳实践。我们将通过具体示例展示如何有效使用try-catch块、throws关键字和自定义异常类,以帮助读者更好地理解和应用Java异常处理机制。
10 1
|
3天前
|
XML Web App开发 JavaScript
|
1月前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
3月前
|
XML Java 数据格式
java创建xml文件内容
java创建xml文件内容
|
3月前
|
XML Java 数据格式
java解析xml文件内容
java解析xml文件内容
|
18天前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
23 1

推荐镜像

更多