【问题标题】:Obtaining DOCTYPE details using SAX (JDK 7)使用 SAX (JDK 7) 获取 DOCTYPE 详细信息
【发布时间】:2014-05-18 05:46:44
【问题描述】:

我正在使用 JDK7 附带的 SAX 解析器。我正在尝试获取 DOCTYPE 声明,但DefaultHandler 中的任何方法似乎都没有被解雇。我错过了什么?

import java.io.StringReader;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class Problem {

    public static void main(String[] args) throws Exception {
        String xml = "<!DOCTYPE HTML><html><head></head><body></body></html>";
        SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
        InputSource in = new InputSource(new StringReader(xml));
        saxParser.parse(in, new DefaultHandler() {

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

这会产生:

Element: html
Element: head
Element: body

想要它产生:

DocType: HTML
Element: html
Element: head
Element: body

如何获取 DocType?


更新:看起来有一个 DefaultHandler2 类要扩展。我可以用它作为替代品吗?

【问题讨论】:

    标签: java xml-parsing sax


    【解决方案1】:

    使用具有startDTD() 方法的org.xml.sax.ext.DefaultHandler2 而不是DefaultHander

    报告 DTD 声明的开始,如果有的话。该方法旨在 报告 DOCTYPE 声明的开始;如果文件 没有 DOCTYPE 声明,这个方法不会被调用。

    所有通过 DTDHandler 或 DeclHandler 事件报告的声明 必须出现在 startDTD 和 endDTD 事件之间。声明是 假定属于内部 DTD 子集,除非它们出现 在 startEntity 和 endEntity 事件之间。评论和处理 来自 DTD 的指令也应该在 startDTD 之间报告 和 endDTD 事件,按照(逻辑)发生的原始顺序; 它们不需要出现在相对于它们的正确位置 但是,DTDHandler 或 DeclHandler 事件。

    请注意,start/endDTD 事件将出现在 来自 ContentHandler 和第一个之前的 start/endDocument 事件 startElement 事件。

    但是,您还必须为 XML Reader 设置 LexicalHandler。

    import java.io.StringReader;
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    import org.xml.sax.Attributes;
    import org.xml.sax.InputSource;
    import org.xml.sax.SAXException;
    import org.xml.sax.ext.DefaultHandler2;
    
    public class Problem{
    
        public static void main(String[] args) throws Exception {
            String xml = "<!DOCTYPE html><hml><img/></hml>";
            SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
            InputSource in = new InputSource(new StringReader(xml));
    
            DefaultHandler2 myHandler = new DefaultHandler2(){
                @Override
                public void startElement(String uri, String localName, String qName,
                        Attributes attributes) throws SAXException {
                    System.out.println("Element: " + qName);
                }
    
                @Override
                public void startDTD(String name,  String publicId,
                String systemId) throws SAXException {
                    System.out.println("DocType: " + name);
                }
            };
            saxParser.setProperty("http://xml.org/sax/properties/lexical-handler",
                                   myHandler);
            saxParser.parse(in, myHandler);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-08-04
      • 1970-01-01
      • 1970-01-01
      • 2013-01-19
      • 1970-01-01
      • 2014-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多