JAXB - 如何在没有 XSD 的情况下解组 XML 其中包含没有包装器的列表

JAXB - How to unmarshall XML without XSD which contains lists without wrappers

我有一个必须解析的复杂 XML 文件,但我没有任何 XSD。 XML 看起来像这样(简化):

<?xml version="1.0" encoding="UTF-8"?>
<mets:mets ... namespace declaration ommited ... >
      <mets:metsHdr>
          complex mets:metsHdr
      </mets:metsHdr>


      <mets:dmdSec>
          complex mets:dmdSec 1
      </mets:dmdSec>
        ....
      <mets:dmdSec>
          complex mets:dmdSec n
      </mets:dmdSec>


      <mets:fileSec>
          complex mets:fileSec 1
      <mets:fileSec>
        ....
      <mets:fileSec>
          complex mets:fileSec n
      <mets:fileSec>
</mets:mets>

有一个 header 元素,未包装的 dmdSec 列表和未包装的 fileSec 列表。我首先尝试阅读 mets:dmdSec 列表,使用这些 类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "mets")
public class Mets {
    @XmlAttribute(name="TYPE")
    private String type;

    @XmlList
    private List<DmdSec> dmdSec;

}


@XmlType
public class DmdSec {

    @XmlAttribute(name="ID")
    private String id;

}

但是我得到了这个例外: 线程 "main" javax.xml.bind.DataBindingException 中的异常:com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException:1 次 IllegalAnnotationExceptions www.loc.gov.METS.DmdSec 映射到结构化的 XML 片段(也称为复杂类型),因此与 @XmlList 不兼容。 此问题与以下位置有关: 在私人 java.util.List www.loc.gov.METS.Mets.dmdSec 在 www.loc.gov.METS.Mets</p> <pre><code>at javax.xml.bind.JAXB.unmarshal(Unknown Source)

@XmlElement(name="dmdSec")
private List<DmdSec> dmdSec;

应该做这些工作,而且你的 类 不匹配 xml,dmdSec 没有 id...

您还可以使用:http://www.freeformatter.com/xsd-generator.html#ad-output 生成架构,并从中生成 类 或者至少从中寻求灵感。