gpt4 book ai didi

xsd - XSD格式

转载 作者:行者123 更新时间:2023-12-04 13:29:28 35 4
gpt4 key购买 nike

该XSD部分是从http://www.iana.org/assignments/xml-registry/schema/netconf.xsd获得的

 <xs:complexType name="rpcType">
<xs:sequence>
<xs:element ref="rpcOperation"/>
</xs:sequence>
<xs:attribute name="message-id" type="messageIdType" use="required"/>
<xs:anyAttribute processContents="lax"/>
</xs:complexType>
<xs:element name="rpc" type="rpcType"/>

NETCONF中功能调用的核心是XML文档的节点。我很好奇为什么它不是这样的:
 <xs:element name="rpcType">
<xs:complexType>
<xs:sequence>
<xs:element ref="rpcOperation"/>
</xs:sequence>
<xs:attribute name="message-id" type="messageIdType" use="required"/>
<xs:anyAttribute processContents="lax"/>
</xs:complexType>
</xs:element>

原因是在#1中尝试编码bean(在jaxb2中)时出现异常:
[com.sun.istack.SAXException2: unable to marshal type "netconf.RpcType" as an element because it is missing an @XmlRootElement annotation]

我已经一遍又一遍地阅读 this文章,真的无法把握其中的区别,以及为什么它会是#1 vs#2 ...

最佳答案

不太明显,我会给你的。它取决于类型与元素的决定。

当你有类似的东西

<xs:element name="rpcType">
<xs:complexType>

这本质上是一个“匿名类型”,并且是除了元素 rpcType内部之外永远不会出现的类型。由于这种确定性,XJC知道该类型将始终具有名称 rpcType,因此会使用 @XmlRootElement名称为其生成 rpcType批注。

另一方面,当你有
<xs:complexType name="rpcType">

那么这定义了一个可重用的类型,它可能由几个不同的元素引用。在您的模式中仅由一个元素引用这一事实是无关紧要的。由于存在这种不确定性,XJC会套期保值并不会生成 @XmlRootElement

JAXB引用实现具有专有的XJC标志 "simple binding mode",该标志除其他外还假定您正在编译的模式永远不会扩展或与另一个模式结合。这使它可以做一些假设,因此,如果看到一个命名的 complexType仅被一个 element使用,则它通常会为其生成 @XmlRootElement

实际情况比这更微妙和复杂,但是在90%的情况下,这是一个充分的解释。

关于xsd - XSD格式<element> <complexType>与<complexType/> <element/>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3639313/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com