【问题标题】:SAX parser load the DTD fileSAX 解析器加载 DTD 文件
【发布时间】:2016-07-27 08:05:16
【问题描述】:
我之前用过DOM解析器,把DTD文件放在项目下,DOM代码可以检测到DTD文件本身,根据规则解析文件。
当我转移到 SAX 解析器时,似乎 SAX 解析器在没有设置的情况下无法检测到 DTD 文件本身。有一些帖子提到使用resolveEntity(),虽然我不是很理解。谁能帮我解决这个问题,以一种简单的方式(在没有 CMD 的 eclipse 中)将本地 DTD 文件加载到我的 java 代码中?
如果有人能给出代码示例,那就最好了。
【问题讨论】:
标签:
java
parsing
xml-parsing
sax
【解决方案1】:
我发布了一个可行的解决方案,并且我从 SAX 文档中获取了输入。我已经将 W3 Schools 的示例 DTD 和 XML 用于相同 (http://www.w3schools.com/xml/xml_dtd.asp) ,如果 DOCTYPE 在单独的文件中则不需要,因此从 DTD 中删除了这一行。不确定它是否是您想要的样本,希望对您有所帮助!
public static void main(String[] args) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
factory.setValidating(true);
XMLReader reader = factory.newSAXParser().getXMLReader();
reader.parse(new InputSource(new FileInputStream("C:\\DevelopmentTools\\3.CODE\\SAX-XML.txt")));
reader.setEntityResolver(new EntityResolver() {
@Override
public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
// TODO Auto-generated method stub
if (systemId == null) {
systemId = "C:\\DevelopmentTools\\3.CODE\\99.WORKSPACE\\Note.dtd";
}
InputSource result = null;
result = new InputSource(systemId);
return result;
}
});
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}