将s:元素和s:complexType命名为同名

时间:2014-05-07 10:08:49

标签: java xml web-services cxf

将s:元素和s:complexType命名为同名是否合法? 您可以看到以下代码,元素和complextype具有完全相同的名称 这是一块wsdl文件。

<s:element name="ProcessTaskActionResponse">
 <s:complexType>
  <s:sequence>
    <s:element minOccurs="0" maxOccurs="1" name="ProcessTaskActionResult" type="tns:ProcessTaskActionResponse"/>
  </s:sequence>
 </s:complexType>
</s:element>

<s:complexType name="ProcessTaskActionResponse">
 <s:sequence>
  <s:element minOccurs="0" maxOccurs="1" name="TaskId" type="tns:ArrayOfServerId"/>
    <s:element minOccurs="1" maxOccurs="1" name="Success" type="s:boolean"/>
    <s:element minOccurs="0" maxOccurs="1" name="ActionPerformedLabel" type="s:string"/>
    <s:element minOccurs="0" maxOccurs="1" name="Errors" type="tns:ArrayOfString"/>
    <s:element minOccurs="1" maxOccurs="1" name="RemovedFromTaskList" type="s:boolean"/>
 </s:sequence>
</s:complexType>

2 个答案:

答案 0 :(得分:3)

是的,在XML Schema中使用具有相同名称的复杂类型和元素是合法的。

由于您的问题用[java]和[web-services]标记,因此您可能正在使用JAXB(通过JAX-WS)从XML Schema生成类。在这种情况下,由于复杂类型和元素(具有匿名复杂类型)具有相同的名称,因此您需要使用外部绑定文件来重命名其中一个生成的类。


更新

  好的猜测! JAXB解析器抛出异常,主要是因为   命名冲突,我的问题是它的合法性,为什么JAXB不喜欢   它?

JAXB (JSR-222)将复杂类型转换为Java类。对于命名复杂类型,结果类名称是从复杂类型名称派生的,对于匿名复杂类型,结果类名称是从封闭元素派生的。在您的情况下,这将导致两个类与JAXB抱怨的名称相同。

重命名对应于XML元素的类(binding.xml)

<jxb:bindings 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    version="2.1">

    <jxb:bindings schemaLocation="your-schema.xsd">
            <jxb:bindings node="//xs:element[@name='ProcessTaskActionResponse']/complexType">
                <jxb:class name="ProcessTaskActionResponseElement"/>
            </jxb:bindings>
    </jxb:bindings>

</jxb:bindings>

重命名对应于复杂类型的类(binding.xml)

<jxb:bindings 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    version="2.1">

    <jxb:bindings schemaLocation="your-schema.xsd">
            <jxb:bindings node="//xs:complexType[@name='ProcessTaskActionResponse']">
                <jxb:class name="ProcessTaskActionResponseType"/>
            </jxb:bindings>
    </jxb:bindings>

</jxb:bindings>

答案 1 :(得分:0)

仅仅考虑一个元素和一个具有相同名称的ComplexType是否正确,这里是W3专门授权它的部分:

http://www.w3.org/TR/xmlschema-1/

第2.5节

“例如,同一名称可以出现在类型定义和元素声明中,两者之间没有冲突或必要的关系。”