使用JAXB解组XML时出现错误,原因是DTD文件。

10
我试图使用JAXB(javax.xml.bind.JAXB)解析XML文件(test.xml),但是它给了我这个错误:
[org.xml.sax.SAXParseException; systemId: file:/C:/Users/EXAMPLE/AppData/Local/Eclipse/workspace_4.4.0/EXAMPLE/test.xml; lineNumber: 2; columnNumber: 42; Externe DTD: Lesen von externer DTD "example.dtd" nicht erfolgreich, da "file"-Zugriff wegen der von der Eigenschaft "accessExternalDTD" festgelegten Einschränkung nicht zulässig ist.]
阅读外部DTD“example.dtd”失败,因为“accessExternalDTD”属性设置的限制不允许“File”访问。
已尝试的解决方案:
- 检查所有用户(包括系统)是否具有对两个文件的读写权限。 - 删除并使用新文件进行测试。 - 尝试查找accessExternalDTD属性。
需要注意的事项:
- 项目正在Subversion中运行。 - 我在以前的项目中使用了相同的方法和相同的.dtd和.xml文件,而且它运行得很好。 - XML文件第2行内容:
2个回答

12

accessExternalDTD属性可以通过系统属性javax.xml.accessExternalDTD进行控制,因此使用-Djavax.xml.accessExternalDTD=true启动程序,它应该可以正常工作。还可以在非编组器上设置该属性,请尝试以下操作:

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

非常感谢!我会尽快尝试,如果有效的话,我会接受你的答案 :) - LoremIpsum
15
"-Djavax.xml.accessExternalDTD=true" 无效,而"-Djavax.xml.accessExternalDTD=all" 有效!更加可移植的做法是在代码中这样写: System.setProperty("javax.xml.accessExternalDTD", "all"); 对我来说,使用unmarshaller.setProperty() 的解决方案不起作用。 - HammerNL
@HammerNL,你是我的救星!这可能值得开一个新的帖子或作为另一个答案。 - leventunver
这个答案没有解释accessExternalDTD=all的作用,也没有说明这样做是否安全。 - Graham Leggett

6
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);
    }

}

1
这确实解决了异常,但请注意这会禁用DTD检查,这可能不是你想要的! - HammerNL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接