以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 DOM/SAX/XPath 』  (http://bbs.xml.org.cn/list.asp?boardid=11)
----  [求助]如果让SAX跳过解析实体引用  (http://bbs.xml.org.cn/dispbbs.asp?boardid=11&rootid=&id=83804)


--  作者:ronnhu
--  发布时间:3/12/2010 2:40:00 PM

--  [求助]如果让SAX跳过解析实体引用
情况如下:
同一个目录下有两个xml文件:

all.xml:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE fcom SYSTEM "fcom.dtd"[
<!ENTITY subcontent SYSTEM "subcontent.xml">
]>
<fcom>
<title>some title here</title>
&subcontent;
<subcontent>content here</subcontent>
</fcom>

subcontent.xml:
<?xml version="1.0" encoding="utf-8"?>
<subcontent>content from a file</subcontent>

JAVA代码:
   File parent = new File("D:/techuser/data/techair/a340/fcom/v01/r25a/FunctionTest");
   File xmlFile = new File(parent, "all.xml");
   File outputFile = new File(parent, "output.xml");
   
   XMLReader reader = TechpublisherService.newXMLReader();
   
   reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
   //reader.setFeature("http://xml.org/sax/features/external-general-entities", false);
   
   String xmlHead = TechpublisherService.getXmlHead(xmlFile);//可以不管
   
   ContentHandler outputHandler = new OutputHandler(outputFile, xmlHead);//这个handler只是把独到的xml内容输出到output.xml文件里。
   reader.setContentHandler(outputHandler);
   
   reader.parse(xmlFile.getAbsolutePath());

当用SAX解析all.xml的时候如果碰到&subcontent;,解析器会去读subcontent.xml里的内容,并将&subcontent;替换成读到的内容。
这段代码执行的结果是生成一个output.xml文件,里面的内容为:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE fcom SYSTEM "fcom.dtd"[
]>
<fcom>
<title>some title here</title>

<subcontent>content from a file</subcontent>
<subcontent>content here</subcontent>
</fcom>

但是我不想解析all.xml里的实体引用,所有为reader加上了一个特性,代码如下:

reader.setFeature("http://xml.org/sax/features/external-general-entities", false);

但生成的output.xml里的内容变成了这样:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE fcom SYSTEM "fcom.dtd"[
]>
<fcom>
<title>some title here</title>

<subcontent>content here</subcontent>
</fcom>

可以看出,all.xml里的&subcontent;被替换成了空字符串。

我希望的结果是&subcontent;不要被替换掉,把&subcontent;就当做正常的文本字符,不要解析,保留&subcontent;不变,output.xml里该是什么样还是什么样。

PS:用最新版的xerces-2.9.1,默认是不替换,直接满足我的需求,但我用的是旧版本的,替换为空字符串了。但现在的项目不可能为了解决这个问题而换类库。
这个问题困扰了我很久,还请各位达人出谋划策,谢谢!


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms