如何解组实体包含对JAXB的文件引用?

时间:2016-06-16 12:21:34

标签: java xml jaxb

我正在尝试将文本文件内容包含到xml文件中。我使用以下文件。我在bar属性上得到UnmarshalException。请指教。非常感谢。

thankyou.properties文件

Thank you

XML文件

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE doc [
<!ELEMENT bar (#PCDATA)>
<!ENTITY otherFile SYSTEM "thankyou.properties">
]>

<doc>
  <foo>
    <bar>&otherFile;</bar>
  </foo>
</doc>

我的XSD

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="doc">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="foo">
          <xs:complexType>
            <xs:sequence>
              <xs:element type="xs:string" name="bar"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Java模型

@XmlRootElement(name = "doc")
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {

  @XmlElement(name = "bar")  
  private String bar;

}

我得到的例外是

Caused by: javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"bar"). Expected elements are <{

1 个答案:

答案 0 :(得分:0)

您遇到的异常是因为您的JAXB映射不正确。

试试这个:

@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {

  @XmlElement(name = "bar")  
  private String bar;

}

@XmlRootElement(name = "doc")
@XmlAccessorType(XmlAccessType.FIELD)
public class Doc {

  @XmlElement(name = "foo")  
  private Foo foo;

}

然后通过将Doc类绑定到您的JAXBContext来解组:

Unmarshaller um = JAXBContext.newInstance(Doc.class).createUnmarshaller();
Doc doc = um.unmarshall(yourFile);

此外,我不确定您是否能够按照您想要的方式添加文件。

解决方法是使用XmlAdapter和@XmlJavaTypeAdapter:将filePath提供给bar元素,然后使用适配器加载文件内容。