1

我正在使用 Java SAX 解析器(org.xml.sax.ext.DefaultHandler2 的实现)来解析 XML 文档,并且该文档有一个指向 DTD 的 DOCTYPE 声明。由于一些奇怪的原因,我需要知道“doctype”关键字本身已经写在原始文档中的大小写,以便我可以使用完全相同的大小写输出文档。

也就是说,我需要能够区分:

<!DOCTYPE thing SYSTEMID ...>

...从:

<!doctype thing SYSTEMID ...>

有没有办法从解析器本身实现这一点?(我的意思是,在执行解析器之前不读取流的前 n 个字节)

谢谢

4

2 回答 2

3

如果输入是 XML,则 DOCTYPE 为大写。相反,如果 DOCTYPE 为小写,则输入不是 XML。因此,如果 SAX 解析器成功通过 DOCTYPE 声明,您就知道它是大写的。

于 2012-04-25T15:23:08.143 回答
2

最后,Java XML 解析器似乎无法告诉您 DOCTYPE 子句的原始情况,因为它会认为它始终是大写的(这是 XML 规范所说的,但可能不是如果您尝试使用此类 XML 解析器来解析 HTML5,则为 true)。

我解决这个问题的方法是实现我自己的 java.io.Reader,它允许我读取文件的字节并确定 DOCTYPE 子句的原始大小写,然后在 XML SAX 解析器中使用这个 Reader。解析完成后,我会问读者对象该子句的情况是什么,我会得到正确的答案。

它又脏又丑,但是……似乎是唯一真正的选择。

于 2012-05-29T15:34:25.490 回答