java解析xml文件读取本地dtd或者忽略dtd
2012-07-06 10:01
926 查看
Java程序在解析xml文件时,如果xml文件中指定了dtd,在默认会从指定的url下载dtd文件,但是很多情况下如果网络连接不上,或者防火墙原因,dtd文件无法下载下来导致程序报连接超时异常,解析xml失败。有两种方法解决该类问题:
1.指定从本地读取dtd文件
若要解析的xml文件中有如下的dtd声明:。
<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "http://docs.oasis-open.org/dita/v1.2/os/dtd1.2/technicalContent/dtd/concept.dtd">
publicId:被引用的外部实体的公共标识符,如果未提供,则为 null。
上述的dtd声明中publicId为-//OASIS//DTD
DITA Concept//EN
systemId:被引用的外部实体的系统标识符。
上述的dtd声明中systemId为http://docs.oasis-open.org/dita/v1.2/os/dtd1.2/technicalContent/dtd/concept.dtd
可以通过重新SAX的EntityResolver类的resolveEntity(String publicId, String systemId)
throws SAXException, IOException方法指定读取本地的dtd文件,该放在在XML解析器解析xml之前调用,用于加载指定的dtd文件:
注意:
经常测试发现,这种方法只对SYSTEM(本地dtd)有效,如:
<!DOCTYPE concept SYSTEM "http://docs.oasis-open.org/dita/v1.2/os/dtd1.2/technicalContent/dtd/concept.dtd">
但是对于PUBLIC(外部dtd)不起作用,如:
<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "http://docs.oasis-open.org/dita/v1.2/os/dtd1.2/technicalContent/dtd/concept.dtd">
PUBLIC方式的dtd依然从外部下载dtd,只能通过第二种方式忽略dtd校验。
2.解析xml文件时彻底忽略dtd:
SAX解析器可以通过指定http://apache.org/xml/features/nonvalidating/load-external-dtd属性来确定是否忽略dtd,例子如下:
1.指定从本地读取dtd文件
若要解析的xml文件中有如下的dtd声明:。
<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "http://docs.oasis-open.org/dita/v1.2/os/dtd1.2/technicalContent/dtd/concept.dtd">
publicId:被引用的外部实体的公共标识符,如果未提供,则为 null。
上述的dtd声明中publicId为-//OASIS//DTD
DITA Concept//EN
systemId:被引用的外部实体的系统标识符。
上述的dtd声明中systemId为http://docs.oasis-open.org/dita/v1.2/os/dtd1.2/technicalContent/dtd/concept.dtd
可以通过重新SAX的EntityResolver类的resolveEntity(String publicId, String systemId)
throws SAXException, IOException方法指定读取本地的dtd文件,该放在在XML解析器解析xml之前调用,用于加载指定的dtd文件:
/** * Implementation of <code>org.xml.sax.EntityResolver</code> that loads * entitities (for example dtd files) from the classpath. */ public class ClasspathEntityResolver implements EntityResolver { public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException { if (systemId != null) { int index = systemId.lastIndexOf('/'); if (index != -1) { systemId = systemId.substring(index + 1); } systemId = "/" + systemId; InputStream istr = Thread.currentThread().getContextClassLoader().getResourceAsStream(systemId); if (istr != null) { return new InputSource(istr); } } return null; } }在SAX解析xml文件之前,指定使用自定义的ClasspathEntityResolver:
SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser saxParser = spf.newSAXParser(); xmlReader = saxParser.getXMLReader(); xmlReader.setEntityResolver(new ClasspathEntityResolver()); xmlReader.setContentHandler(handler); try { xmlReader.parse(new InputSource(inputFilePath)); } catch (Exception e) { e.printStackTrace(); }
注意:
经常测试发现,这种方法只对SYSTEM(本地dtd)有效,如:
<!DOCTYPE concept SYSTEM "http://docs.oasis-open.org/dita/v1.2/os/dtd1.2/technicalContent/dtd/concept.dtd">
但是对于PUBLIC(外部dtd)不起作用,如:
<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "http://docs.oasis-open.org/dita/v1.2/os/dtd1.2/technicalContent/dtd/concept.dtd">
PUBLIC方式的dtd依然从外部下载dtd,只能通过第二种方式忽略dtd校验。
2.解析xml文件时彻底忽略dtd:
SAX解析器可以通过指定http://apache.org/xml/features/nonvalidating/load-external-dtd属性来确定是否忽略dtd,例子如下:
SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser saxParser = spf.newSAXParser(); xmlReader = saxParser.getXMLReader(); xmlReader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); xmlReader.setContentHandler(handler); try { xmlReader.parse(new InputSource(inputFilePath)); } catch (Exception e) { e.printStackTrace(); }这样指定之后,解析xml文件时,不再进行dtd校验。
相关文章推荐
- jdom或dom4j读取xml文件时如何让dtd验证使用本地dtd文件或者不生效
- 分享非常有用的Java程序 (关键代码)(六)---解析/读取XML 文件(重要)
- java读取Xml,写入Xml的简单Dom操作,忽略DTD验证
- jdom 或 dom4j读取xml文件时如何让dtd验证使用本地dtd文件或者不生效
- jdom 或 dom4j读取xml文件时如何让dtd验证使用本地dtd文件或者不生效
- 分享非常有用的Java程序 (关键代码)(六)---解析/读取XML 文件(重要)
- Java眼中的XML--文件读取--2 应用SAX方式解析XML
- android 读取assets下文件或者 java读取本地文件
- Java眼中的XML--文件读取--1 应用DOM方式解析XML
- jdom 或 dom4j读取xml文件时如何让dtd验证使用本地dtd文件或者不生效
- Java眼中的XML--文件读取--2 应用SAX方式解析XML
- Dom4J --- 使用dom4j解析XML时候忽略DTD文件
- java如何解析/读取xml文件
- JAVA解析XML配置文件的读取操作
- 分别在Java工程和javaweb工程读取xml文件或者properties文件
- jdom 或 dom4j读取xml文件时如何让dtd验证使用本地dtd文件或者不生效
- [转载]JAVA高手解析XML配置文件的读取操作
- JAVA高手解析XML配置文件的读取操作
- Java眼中的XML--文件读取--2 应用SAX方式解析XML
- Java用jdom.jar解析读取XML文件信息