使用DTD文件将JAXB解组XML时出错

Lor*_*sum 4 java xml dtd jaxb unmarshalling

我尝试使用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.]

英文翻译:

Reading from external DTD "example.dtd"  not succesfull , couse "File"-Access is not allowed by the Restriction set by the Proppertie "accessExternalDTD"
Run Code Online (Sandbox Code Playgroud)

已经尝试过的解决方案:

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

注意事项:

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

Pet*_*ter 6

accessExternalDTD属性可以用系统属性进行控制javax.xml.accessExternalDTD,所以开始你的计划-Djavax.xml.accessExternalDTD=true,它应该工作。也可以在解组器上设置属性,请尝试以下操作:

unmarshaller.setProperty(javax.xml.XMLConstants.ACCESS_EXTERNAL_DTD, Boolean.TRUE);
Run Code Online (Sandbox Code Playgroud)

  • “ -Djavax.xml.accessExternalDTD = true”不起作用,“-Djavax.xml.accessExternalDTD = all”起作用!在代码中执行此操作可移植性更高:System.setProperty(“ javax.xml.accessExternalDTD”,“ all”); unmarshaller.setProperty()解决方案对我不起作用。 (7认同)

Tha*_*nga 5

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

}
Run Code Online (Sandbox Code Playgroud)