使用java编辑XML实体的链接

时间:2015-05-20 14:41:40

标签: java xml parsing

我正在尝试使用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但是,不改变原始链接(我不会写入文件以更改链接。)

我该怎么做? 谢谢你的帮助!

1 个答案:

答案 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,...)解析器。