如何在 wsdl 中设置架构以正确解析项目列表?

How can I set the schema in a wsdl to correctly parse a list of items?

我进行了深入搜索,但没有找到解决此问题的方法: 我有一个 Web 服务需要接受这样的项目列表:

<registrationform>  
    ...
    ...
    <registerdoclist>
        <registerdoc>
            <date>2015-10-27</date>
            <doctype>CC</doctype>
            <filename>document1.pdf</filename>
            <filecontent>JVBERi0xLjUNCi1tb1DQoxIDAg</filecontent>
            <extrainfo>document A</extrainfo>
        </registerdoc>
        <registerdoc>
            <date>2015-10-27</date>
            <doctype>CC</doctype>
            <filename>document2.pdf</filename>
            <filecontent>IHRydWU+Pj4+DQplbmRvYmoNCjI</filecontent>
            <extrainfo>document b</extrainfo>
        </registerdoc>
    </registerdoclist>
    ...
    ...
</registrationform>

架构是这样配置的(只有相关部分):

<xs:element maxOccurs="unbounded" minOccurs="0" name="registerdoclist" nillable="true" type="tns:registerdoc"/>


 <xs:complexType name="registerdoc">
            <xs:sequence>
                <xs:element  minOccurs="1" name="date"          type="xs:date"/>
                <xs:element  minOccurs="1" name="doctype"       type="tns:Alfa3Type"/>
                <xs:element  minOccurs="1" name="filename"      type="tns:Alfa255Type"/>
                <xs:element  minOccurs="1" name="filecontent"   type="xs:base64Binary"/>
                <xs:element  minOccurs="0" name="url"           type="tns:Alfa255Type"/>
                <xs:element  minOccurs="0" name="extrainfo"     type="tns:Alfa255Type"/>                    
            </xs:sequence>
           </xs:complexType>

当我生成网络服务 java 对象时,在注册 class 中,registerdoclist 似乎没问题,因为它是 Registerdoc 对象的列表:

@XmlElement(nillable = true)
protected List<Registerdoc> registerdoclist;

和 Registerdoc class:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "registerdoc", propOrder = {
    "date",
    "doctype",
    "filename",
    "filecontent",
    "url",
    "extrainfo"
})
public class Registerdoc {

    @XmlElement(required = true, type = String.class)
    @XmlJavaTypeAdapter(SctdXmlGregorianCalendarAdapter.class)
    @XmlSchemaType(name = "date")
    protected XMLGregorianCalendar date;
    @XmlElement(required = true)
    protected String doctype;
    @XmlElement(required = true)
    protected String filename;
    @XmlElement(required = true)
    protected byte[] filecontent;
    protected String url;
    protected String extrainfo;
    ...
    ...

在 registrationform 对象中,我有一个名为 registerdoclist 的 registerdoc 对象列表,这些对象显然与要解析的 xml 结构相匹配,但是当我调用 web 服务时,出现此错误:

 <faultstring><![CDATA[Unmarshalling Error: unexpected element (uri:"", local:"registerdoc")

那么,模式有什么问题?我如何配置它以正确解析上面显示的列表 registerdoclist 中的示例 xml?

您的 XML 包含 <registerdoclist>...</registerdoclist> 个包含元素 <date> 等的元素,因此缺少 XML 个元素的集合包装级别。

您需要一个额外的 class 来容纳 List<Registerdoc>:

<xs:element name="registerdoclist" type="tns:registerdoclist"/>

<xs:complexType name="registerdoclist">
  <xs:sequence>
    <xs:element maxOccurs="unbounded" minOccurs="0"
                name="registerdoc" type="tns:registerdoc"/>
  </xs:sequence>
</xs:complexType>