我知道这个问题在互联网上已经asked quite a lot,但我陷入了困境。
问题:
我得到了一些我需要解析的XML文件(OpenStreetMap - .osm)。我解析这些OSM文件的方法如下:( edit-this方法将OSMHandler设置为我的ContentHandler,并在该类中进行实际解析)
void parseOSM(String filename) {
try {
XMLReader reader =
XMLReaderFactory.createXMLReader();
reader.setContentHandler(
new OSMHandler()); //extends DefaultHandler
reader.parse(filename);
} catch (SAXException | IOException e) {
throw new RuntimeException(e);
}
}
当您在IntelliJ中运行应用程序时,这可以正常工作,但现在我需要创建一个只需双击即可运行的.jar。
根据我的理解,我们需要将OSM文件作为资源获取,例如:
InputStream is = getClass().getResourceAsStream(filename);
我不太确定我是如何要求我的OSMHandler解析这个InputStream的,因为parse方法只接受一个String。谁能详细说明从这里做什么?
修改
我确实尝试了以下内容:
void parseOSM_jar(String filename){
InputStream is = getClass().getResourceAsStream(filename);
try
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(is);
}
catch (Exception e)
{
e.printStackTrace();
}
}
这里的问题是,就我而言,它不会将我的OSMHandler类调用/设置为“解析器”。
最终编辑
现在有效,感谢简单的提示。我只需按如下方式使用InputSource:
void parseOSM(String filename) throws ParserConfigurationException {
InputStream stream = getClass().getResourceAsStream(filename);
InputSource input = new InputSource(stream);
try {
XMLReader reader =
XMLReaderFactory.createXMLReader();
reader.setContentHandler(
new OSMHandler());
reader.parse(input);
} catch (SAXException | IOException e) {
throw new RuntimeException(e);
}
}