我正在尝试使用Java编辑XML文件中的实体链接。
事实上,原始链接是一个互联网链接,我想在解析文档时将其转换为本地链接。 顺便说一句,我将下载我们可以通过此链接获得的内容。
这是原始链接:
<!ENTITY % ISOEntities PUBLIC "ISO 8879-1986//ENTITIES ISO Character Entities 20030531//EN//XML" "http://www.website.com/category/xml_schema/ISOEntities">
这是我想要的结果
<!ENTITY % ISOEntities PUBLIC "ISO 8879-1986//ENTITIES ISO Character Entities 20030531//EN//XML" "C:\data\xml\entities\ISOEntities">
所以我想在这里做的基本上是在检测到原始链接时,我想从本地链接(而不是互联网链接)导入数据ISOEntities但是,不改变原始链接(我不会写入文件以更改链接。)
我该怎么做? 谢谢你的帮助!
答案 0 :(得分:2)
适当的方式将根据您用于解析数据的XML库而有所不同,但基本概念是将一些配置插入到解析器中,该解析器拦截加载特定实体的请求并将它们重定向到本地缓存副本。对于SELECT
Foo.Bar
FROM
Foo
WHERE
CONTAINS(Foo.Bar, '"A" OR "B"')
的SAX和DOM解析器,这意味着javax.xml.parsers
:
EntityResolver
您可以将该实体解析器传递给EntityResolver resolver = new EntityResolver() {
public InputSource resolveEntity(String publicId, String systemId) {
if("ISO 8879-1986//ENTITIES ISO Character Entities 20030531//EN//XML".equals(publicId)) {
return new InputSource("file:/C:/data/xml/entities/ISOEntities");
} else {
return null; // use the default resolution logic
}
}
};
(对于SAX)或XMLReader
(对于DOM),它将从本地副本加载ISO实体。如果您可以使用自定义实体传入适当配置的DocumentBuilder
,则相同的机制将适用于在内部使用SAX或DOM进行解析的任何其他XML库(例如,JDOM,Dom4J,XOM,...)解析器。