使用 DTD 文件导致的 JAXB 解组 XML 时出错

Posted

技术标签:

【中文标题】使用 DTD 文件导致的 JAXB 解组 XML 时出错【英文标题】:Error while unmarshal an XML with JAXB caused by DTD file 【发布时间】:2015-09-26 10:04:50 【问题描述】:

我尝试使用 JAXB (javax.xml.bind.JAXB) 解组文件 XML 文件 (test.xml),但它给了我这个错误:

[org.xml.sax.SAXParseException;系统标识: 文件:/C:/Users/EXAMPLE/AppData/Local/Eclipse/workspace_4.4.0/EXAMPLE/test.xml; 行号:2;列号:42;外部 DTD:Lesen von externer DTD "example.dtd" nicht erfolgreich, da "文件"-Zugriff wegen der von der Eigenschaft "accessExternalDTD" festgelegten Einschränkung nicht zulässigist.]

英文翻译:

从外部 DTD "example.dtd" 读取不成功,原因 “文件”- 属性设置的限制不允许访问 "访问外部DTD"

已经尝试过的解决方案:

检查是否所有用户(包括系统)都可以访问 R/W 两个文件。 已删除并使用新文件进行测试。 试图找到这个accessExternalDTD 属性。

注意事项:

项目正在 Subversion 中运行 我在以前的项目中使用了相同的方法和相同的.dtd.xml 文件,效果很好 来自 XML 文件的第 2 行的内容:<!DOCTYPE EXAMPLE SYSTEM "example.dtd">

【问题讨论】:

【参考方案1】:

accessExternalDTD 属性可以用系统属性javax.xml.accessExternalDTD 控制,所以用-Djavax.xml.accessExternalDTD=true 启动你的程序,它应该可以工作。也应该可以在解组器上设置属性,试试这个:

unmarshaller.setProperty(javax.xml.XMLConstants.ACCESS_EXTERNAL_DTD, Boolean.TRUE);

【讨论】:

感谢您的分配!我会尽快尝试,如果它有效,我可以接受你的回答:) "-Djavax.xml.accessExternalDTD=true" 不起作用,"-Djavax.xml.accessExternalDTD=all" 起作用!更可移植的是在代码中执行此操作: System.setProperty("javax.xml.accessExternalDTD", "all"); unmarshaller.setProperty() 解决方案对我不起作用。 @HammerNL 你是我的救星!这可能值得拥有自己的主题或作为另一个答案。 这个答案没有解释 accessExternalDTD=all 的作用,或者这样做是否安全。【参考方案2】:
import javax.xml.bind.*;
import javax.xml.stream.*;
import javax.xml.transform.stream.StreamSource;

public class Demo 

    public static void main(String[] args) throws Exception 
        JAXBContext jc = JAXBContext.newInstance(Customer.class);

        XMLInputFactory xif = XMLInputFactory.newFactory();
        xif.setProperty(XMLInputFactory.SUPPORT_DTD, false);
        XMLStreamReader xsr = xif.createXMLStreamReader(new StreamSource("input.xml"));

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Customer customer = (Customer) unmarshaller.unmarshal(xsr);
    


【讨论】:

这确实解决了异常,但请注意,此 DISABLES DTD 检查可能不是您想要的!

以上是关于使用 DTD 文件导致的 JAXB 解组 XML 时出错的主要内容,如果未能解决你的问题,请参考以下文章

在将 XML 文件解组为对象后,如何让 JAXB 调用方法?

如何跳过字段并仅使用JAXB解组该字段的特定成员?

使用 JAXB 解组多次出现的 XML 元素

如果命名空间声明在 SOAP 信封上,如何使用 JAXB 解组 SOAP 响应?

使用 Xpath 表达式和 jaxb 解组 XML

JAXB:如何在没有命名空间的情况下解组 XML