You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Java SAX读取XML文件中的XML声明

Java SAX 读取XML声明的实现方案

底层原理

XML声明是XML文档的元信息,不属于普通元素节点或字符内容,因此不会触发DefaultHandler提供的startElement、characters回调,这是SAX解析的标准设计。

具体实现

SAX2扩展接口org.xml.sax.ext.Locator2封装了XML声明的全部属性,只需重写DefaultHandler的setDocumentLocator方法即可获取对应值,修改后的完整代码如下:

import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.ext.Locator2;
import org.xml.sax.helpers.DefaultHandler;

public class SAXStuff {
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        // 可选:开启Locator2扩展支持,主流JDK默认已开启
        factory.setFeature("http://xml.org/sax/features/use-locator2", true);
        SAXParser sp = factory.newSAXParser();
        
        sp.parse("test.xml", new DefaultHandler() {
            @Override
            public void setDocumentLocator(Locator locator) {
                // 判断解析器是否支持Locator2扩展
                if (locator instanceof Locator2) {
                    Locator2 loc2 = (Locator2) locator;
                    // 获取XML声明各属性
                    String version = loc2.getXMLVersion();
                    String encoding = loc2.getEncoding();
                    boolean standalone = loc2.isStandalone();
                    
                    // 输出验证
                    System.out.println("XML版本:" + version);
                    System.out.println("文档编码:" + encoding);
                    System.out.println("是否独立文档:" + (standalone ? "是" : "否"));
                    
                    // 如需拼接完整XML声明字符串可使用如下代码
                    String fullDecl = String.format("<?xml version=\"%s\" encoding=\"%s\" standalone=\"%s\" ?>",
                            version, encoding, standalone ? "yes" : "no");
                    System.out.println("完整XML声明:" + fullDecl);
                }
            }

            @Override
            public void characters(char[] ch, int start, int length) throws SAXException {
                for(int i = start; i < start + length; i++) {
                    System.out.print(ch[i]);
                }
            }

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

内容的提问来源于stack exchange,提问作者user16634609

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 10:21:03