java - JAXB unmarshall unordered elements with multiple occurrences of one of them -
i have xml:
<package> <metadata> <title>title</title> <language>en</language> <meta name="cover" /> </metadata> </package>
another examples of correct xml's:
<package> <metadata> <language>en</language> <title>title</title> </metadata> </package> <package> <metadata> <meta name="content" /> <language>en</language> <meta name="cover" /> <title>title</title> </metadata> </package>
and want unmarshall java class using jaxb library. difficulty amount of "meta" element can 0 multiple , order of elements "title" "language" , "meta"s can random.
my class looks like:
@xmlrootelement(name = "package") @xmlaccessortype(xmlaccesstype.field) public class test { @xmlelement(name = "metadata", required = true) public metadata metadata; @xmlaccessortype(xmlaccesstype.field) @xmltype(proporder={}) public static class metadata { @xmlelement(name = "title", required = true) public string title; @xmlelement(name = "language", required = true) public string language; @xmlelement(name = "meta", required = false) public list<meta> metas; } @xmlaccessortype(xmlaccesstype.field) public static class meta { @xmlattribute(name = "name", required = true) public string name; } }
it matches schema:
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/xmlschema"> <xs:element name="package" type="test"/> <xs:complextype name="test"> <xs:sequence> <xs:element name="metadata" type="metadata"/> </xs:sequence> </xs:complextype> <xs:complextype name="metadata"> <xs:sequence> <xs:element name="title" type="xs:string"/> <xs:element name="language" type="xs:string"/> <xs:element name="meta" type="meta" minoccurs="0" maxoccurs="unbounded"/> </xs:sequence> </xs:complextype> <xs:complextype name="meta"> <xs:sequence/> <xs:attribute name="name" type="xs:string" use="required"/> </xs:complextype> </xs:schema>
when unmarshall document error:
org.xml.sax.saxparseexception: cos-all-limited.2: {max occurs} of element in 'all' model group must 0 or 1. value 'unbounded' element 'meta' invalid.
if remove attribute @xmltype(proporder={}) matches schema:
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/xmlschema"> <xs:element name="package" type="test"/> <xs:complextype name="test"> <xs:sequence> <xs:element name="metadata" type="metadata"/> </xs:sequence> </xs:complextype> <xs:complextype name="metadata"> <xs:sequence> <xs:element name="title" type="xs:string"/> <xs:element name="language" type="xs:string"/> <xs:element name="meta" type="meta" minoccurs="0" maxoccurs="unbounded"/> </xs:sequence> </xs:complextype> <xs:complextype name="meta"> <xs:sequence/> <xs:attribute name="name" type="xs:string" use="required"/> </xs:complextype> </xs:schema>
and error if order of properties different:
invalid content found starting element 'language'. 1 of '{title}' expected.
i can not change xml files, can modify classes and/or annotations. generate schema classes dynamically, schema can adjust.
any ideas how achieve desirable behaviour?
Comments
Post a Comment