如何使用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
相关产品推荐
相关产品推荐

