我正在使用Java SAX解析器(org.xml.sax.ext.DefaultHandler2的实现)来解析XML文档,并且此文档具有指向DTD的DOCTYPE声明。出于一些奇怪的原因,我需要知道在原始文档中写入“doctype”关键字本身的情况,以便我可以使用完全相同的情况输出文档。
这是,我需要能够区分:
<!DOCTYPE thing SYSTEMID ...>
...从:
<!doctype thing SYSTEMID ...>
有没有办法从解析器本身实现? (我的意思是,在执行解析器之前没有求助于读取流的前n个字节)
由于
答案 0 :(得分:3)
如果输入是XML,则DOCTYPE为大写。相反,如果DOCTYPE是小写的,那么输入不是XML。因此,如果SAX解析器成功通过DOCTYPE声明,则您知道它是大写的。
答案 1 :(得分:2)
最后,似乎没有办法让java XML解析器告诉你DOCTYPE子句的原始情况,因为它会认为它始终是大写的(这是XML规范所说的,但是如果您尝试使用此类XML解析器来解析HTML5,则可能不是真的。
我解决这个问题的方法是实现我自己的java.io.Reader,它允许我读取文件的字节并确定DOCTYPE子句的原始情况,然后在XML SAX解析器中使用此Reader。解析完成后,我会问读者对象该子句的情况是什么,我会得到正确的答案。
它既凌乱又丑陋,但......似乎是唯一真正的选择。