将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>
答案 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节
“例如,同一名称可以出现在类型定义和元素声明中,两者之间没有冲突或必要的关系。”