java项目中自定义dtd文件的路径问题

在java项目中使用自定义dtd文件,并且在xml文件中引用dtd文件使用的是相对路径,需要注意的问题

 

dtd文件和对应的xml文件


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE users SYSTEM "image.dtd">
<users>
	<user>
		<id>1</id>
		<name>jerry</name>
		<url></url>
	</user>
	<user>
		<id>2</id>
		<name>tom</name>
		<url></url>
	</user>
	<user>
		<id>3</id>
		<name>tel</name>
		<url></url>
	</user>
</users>
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT users (user*)>
<!ELEMENT user (id,name,url)>
<!ELEMENT id (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT url (#PCDATA)>

java代码

		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		InputStream is = MyXMLTest.class.getClassLoader().getResourceAsStream("image.xml");
		Document root = builder.parse(is);

此时通过builder.parse(inputstream), 如果使用的是public 来定位dtd文件 ,没有什么问题

但是引入的dtd文件是相对路径,运行时

java.io.FileNotFoundException: D:\workspace\workspace_study4editon3\p2p\image.dtd (系统找不到指定的文件。)
java系统就没办法定位到该dtd文件

xml处理器知道如何定位带有公共标识符的dtd,就不需要url了 

而如果使用的是相对url("上面的image.dtd"),那么必须给解析器一个file对象或者url对象,而不能是输入流.如果必须是个 输入流 就需要指定一个resolverEntity接口的实现 为该解析器 

相对路径 时的解决办法

		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		URL url= MyXMLTest.class.getClassLoader().getSystemResource("image.xml");
		Document document = builder.parse(url.toString());

或者

		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		builder.setEntityResolver(new EntityResolver() {
			
			@Override
			public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
				
				return new InputSource(MyXMLTest.class.getClassLoader().getResourceAsStream("image.dtd"));
			}
		});
		InputStream is = MyXMLTest.class.getClassLoader().getResourceAsStream("image.xml");
		Document root = builder.parse(is);

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值