javax.xml包全面教程:DOM和SAX解析、XSLT转换与XML验证

2024-06-21 李腾 78 次阅读 0 次点赞
javax.xml是Java标准库中处理XML的核心包,提供了解析、转换和验证等功能。本文全面介绍了其主要组件,包括DocumentBuilder、SAXParser、Transformer和Validator等,并提供了DOM解析、SAX解析、XSLT转换和XML Schema验证的完整代码示例。通过详细的实例演示和可运行的代码,帮助开发者快速掌握XML处理技术,提升开发效率。

javax.xml 包是 Java 标准库中用于处理 XML 的核心包,提供了 XML 解析、转换、验证等功能。主要包含以下核心组件:

主要类和接口

1. 解析相关

DocumentBuilder - DOM 解析器

SAXParser - SAX 解析器

XMLReader - SAX2 解析器

2. 转换相关

Transformer - XSLT 转换器

TransformerFactory - 转换器工厂

3. 验证相关

Schema - XML Schema

Validator - XML 验证器

示例代码

1. DOM 解析 XML

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class DOMParserExample {
    public static void main(String[] args) {
        try {
            // 创建 DocumentBuilderFactory
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            
            // 解析 XML 文件
            Document document = builder.parse("books.xml");
            document.getDocumentElement().normalize();
            
            // 获取根元素
            System.out.println("根元素: " + document.getDocumentElement().getNodeName());
            
            // 获取所有 book 元素
            NodeList nodeList = document.getElementsByTagName("book");
            
            for (int i = 0; i < nodeList.getLength(); i++) {
                Node node = nodeList.item(i);
                if (node.getNodeType() == Node.ELEMENT_NODE) {
                    Element element = (Element) node;
                    String id = element.getAttribute("id");
                    String title = element.getElementsByTagName("title").item(0).getTextContent();
                    String author = element.getElementsByTagName("author").item(0).getTextContent();
                    String price = element.getElementsByTagName("price").item(0).getTextContent();
                    
                    System.out.println("图书 ID: " + id);
                    System.out.println("标题: " + title);
                    System.out.println("作者: " + author);
                    System.out.println("价格: " + price);
                    System.out.println("------------");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2. SAX 解析 XML

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

public class SAXParserExample {
    public static void main(String[] args) {
        try {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser saxParser = factory.newSAXParser();
            
            DefaultHandler handler = new DefaultHandler() {
                boolean bTitle = false;
                boolean bAuthor = false;
                boolean bPrice = false;
                
                @Override
                public void startElement(String uri, String localName, 
                                       String qName, Attributes attributes) {
                    if (qName.equalsIgnoreCase("book")) {
                        String id = attributes.getValue("id");
                        System.out.println("图书 ID: " + id);
                    }
                    if (qName.equalsIgnoreCase("title")) {
                        bTitle = true;
                    }
                    if (qName.equalsIgnoreCase("author")) {
                        bAuthor = true;
                    }
                    if (qName.equalsIgnoreCase("price")) {
                        bPrice = true;
                    }
                }
                
                @Override
                public void characters(char[] ch, int start, int length) {
                    if (bTitle) {
                        System.out.println("标题: " + new String(ch, start, length));
                        bTitle = false;
                    }
                    if (bAuthor) {
                        System.out.println("作者: " + new String(ch, start, length));
                        bAuthor = false;
                    }
                    if (bPrice) {
                        System.out.println("价格: " + new String(ch, start, length));
                        bPrice = false;
                    }
                }
            };
            
            saxParser.parse("books.xml", handler);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3. XSLT 转换 XML

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;

public class XSLTExample {
    public static void main(String[] args) {
        try {
            // 创建转换器工厂
            TransformerFactory factory = TransformerFactory.newInstance();
            
            // 创建 XSLT 转换器
            Transformer transformer = factory.newTransformer(
                new StreamSource(new File("transform.xsl")));
            
            // 执行转换
            transformer.transform(
                new StreamSource(new File("books.xml")),
                new StreamResult(new File("output.html")));
            
            System.out.println("转换完成!");
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4. XML Schema 验证

import javax.xml.XMLConstants;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;

public class XMLValidationExample {
    public static void main(String[] args) {
        try {
            // 创建 Schema 工厂
            SchemaFactory factory = 
                SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            
            // 创建 Schema
            Schema schema = factory.newSchema(new File("books.xsd"));
            
            // 创建验证器
            Validator validator = schema.newValidator();
            
            // 验证 XML 文件
            validator.validate(new StreamSource(new File("books.xml")));
            
            System.out.println("XML 验证成功!");
            
        } catch (Exception e) {
            System.out.println("验证失败: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

示例 XML 文件 (books.xml)

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
    <book id="1">
        <title>Java 编程思想</title>
        <author>Bruce Eckel</author>
        <price>89.00</price>
    </book>
    <book id="2">
        <title>Effective Java</title>
        <author>Joshua Bloch</author>
        <price>79.00</price>
    </book>
    <book id="3">
        <title>Spring 实战</title>
        <author>Craig Walls</author>
        <price>69.00</price>
    </book>
</bookstore>

主要特点

1、标准化 - 遵循 W3C XML 标准

2、可扩展 - 支持自定义解析器和处理器

3、多解析方式 - 支持 DOM、SAX、StAX 等解析模式

4、安全性 - 提供 XML 外部实体攻击防护

5、性能优化 - 支持各种性能调优选项

本文由人工编写,AI优化,转载请注明原文地址: Java javax.xml包完整使用指南:XML解析、转换与验证实战

评论 (3)

登录后发表评论
沉默的狼2025-12-02 13:18:24
示例代码很实用,特别是DOM解析部分,帮我快速理解了流程。如果能补充一些SAX和StAX解析的对比就更好了,感谢分享!
莎拉Sara2025-11-24 15:50:51
很实用的指南!示例代码清晰,帮我快速理解了DOM解析。请问在处理大型XML文件时,SAX和DOM哪种方式更推荐?
超腾开源2025-11-24 19:58:09
在处理大型XML文件时,SAX(Simple API for XML)通常是更推荐的选择。DOM是将整个XML文档加载到内存中,构建树形结构,内存占用高,处理大型文件时性能瓶颈明显(可能内存溢出)。SAX基于事件流逐行解析,无需预加载整个文档,内存占用极低(仅处理当前节点),适合顺序处理大型文件(最高效)。