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文件:
* 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校验。
Java程序在解析xml文件时,如果xml文件中指定了dtd,在默认会从指定的url下载dtd文件,但是很多情况下如果网络连接不上,或者防火墙原因,dtd文件无法下载下来导致程序报连接超时异常,解析xml失败。有两种方法解决该类问题:1.指定从本地读取dtd文件若要解析的xml文件中有如下的dtd声明:。publicId:被引用的外部实体的公共标识符,如果未提供,则为 null
本文实例讲述了jQuery读取XML文件内容的方法。分享给大家供大家参考。具体实现方法如下:
代码如下:<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<title>jQuery读取XML文件</title>
<meta http-equiv=”Content-Type” conte
jquery读取xml文件
<!DOCTYPE html PUBLIC "-//WC//DTD XHTML . Transitional//EN" "http://www.w.org/TR/xhtml/DTD/xhtml-transitional.dtd">
<html xmlns="http://www.w.org//xhtml">
<title>jQuery 读取XML文件-jQuery学习</title>
<meta http-equiv="Content-Type" content="text/html;
3、通常,xml被用于信息的记录和传递。因此,xml经常被用于充当配置文件
说明:xml作用和数据库类似,就是用来储存传输数据的,但是数据库可扩展性不好,一台电脑读另一台电脑的数据库,还要先按照数据库软件,很麻烦。(写xml,就当成写数据库的一个表格就是了)
二、XML语法格式
1、声明信息,用于描述..
目前有许多解析XML的C开源库可供选择,例如:
1. Libxml2:一款常用的解析XML文档的C库,可以解析XML、HTML、XHTML文档等,支持XPath查询和DTD验证等功能。
2. Expat:另一款常用的解析XML文档的C库,具有轻量级、快速解析等特点,可用于解析大型XML文档。
3. TinyXML:一款小巧的解析XML文档的C++库,具有简单易用的API和优秀的性能,适合用于解析小型XML文档。
4. PugiXML:一款快速、轻量级的解析XML文档的C++库,支持XPath查询和XML树操作等功能,可用于解析大型XML文档。
以上是目前常用的一些解析XML的C开源库,您可以根据自己的需要选择适合的库来解析XML文档。