gpt4 book ai didi

java - 虚假唯一粒子属性 (UPA)

转载 作者:行者123 更新时间:2023-11-30 08:20:59 26 4
gpt4 key购买 nike

给定以下两个模式

(根)

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:someNs="first"
xmlns:someOtherNs="second"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
elementFormDefault="unqualified"
attributeFormDefault="unqualified"
version="1.0"
targetNamespace="first">
<xsd:import namespace="second" schemaLocation="./child.xsd" />
<xsd:element name="employee" type="someNs:fullpersoninfo" />

<xsd:complexType name="personinfo">
<xsd:sequence>
<xsd:element name="firstname" type="xsd:string" />
<xsd:element name="lastname" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>

<xsd:complexType name="fullpersoninfo">
<xsd:complexContent>
<xsd:extension base="someNs:personinfo">
<xsd:sequence>
<xsd:element name="address" type="xsd:string" />
<xsd:element name="city" type="xsd:string" />
<xsd:element name="country" type="xsd:string" />
<xsd:group ref="someOtherNs:Child" />
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:schema>

和( child )

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="someId-1"
targetNamespace="second"
elementFormDefault="qualified"
xmlns:someOtherNs="second"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="second">

<xs:element name="ChildElement" type="ChildElement"
nillable="false" />

<xs:complexType name="ChildElement">
<xs:sequence>
<xs:element name="firstname" type="xs:string" />
<xs:element name="lastname" type="xs:string" />
</xs:sequence>
</xs:complexType>

<xs:group name="Child">
<xs:sequence>
<xs:element ref="ChildElement" minOccurs="0" maxOccurs="1" />
<xs:any processContents="lax" minOccurs="0"
maxOccurs="unbounded"
namespace="##other" />
</xs:sequence>
</xs:group>

</xs:schema>

不应出现唯一粒子属性,因为子级使用 elementFormDefault="qualified" 并且根级使用 elementFormDefault="unqualified"。但是,当通过 Java 的 xjc 运行时,无法使用生成的类,因为类上的注释似乎不够——至少看起来是这样。如何避免 UPA?

问题错误如下:

org.xml.sax.SAXParseException; lineNumber: 8; columnNumber: 41; cos-nonambig:"second":ChildElement and WC[##other:"first"] (or elements from their substitution group) violate "Unique Particle Attribution". During validation against this schema, ambiguity would be created for those two particles.

最佳答案

引用的错误消息表明模式处理器正在解释 <xs:any namespace="##other" .../>允许任何不在命名空间 first 中的元素.也就是说,它将组引用视为一个简单的宏扩展,然后在根架构文档的上下文中创建模型组组件(其中 ##other 将引用目标 namespace first 以外的任何 namespace ) ),而不是在子架构文档的上下文中创建它们(其中 ##other 将引用除目标命名空间 second 之外的任何命名空间)。

一个案例可能是section 3.10.2 of the XSD 1.0 spec要求 ##other在 child.xsd 上下文中被解释:当 namespace="##other" ,通配符组件上的 {namespace constraint} 属性的值被描述为“一对 not<schema> 祖先元素信息项的 targetNamespace [属性] 的·实际值·如果存在,否则·缺席·”——对于 xs:any child.xsd 中的元素,该 targetNamespace 属性的值为 second , 不是 first .

一个案例可能是另一种方式:规范也很清楚,对命名模型组的引用在组件级别是不可见的,局部元素声明的范围由模型组的位置决定引用,而不是模型组定义的位置等。在那些情况下,XSD 规范意味着 ##other 似乎是非常不合理的。这里不应该有“除first之外的任何 namespace ”的解释。

总的来说,我倾向于第一种解释,但我很怀疑是否有可能说服你的工具的创建者改变他们对规范的解释:命名模型组的扩展规则太困惑了并涉及太多的挥手,以轻易说服任何人他们的解释是错误的。

[糟糕。以下所谓的“解决方法”根本不是解决方法:它只是另一种更清晰的方式来引发您的处理器当前表现出的行为。对此感到抱歉。]

一种解决方法:将命名模型组声明添加到您的根架构文档,并引用该文档,而不是 child.xsd 中的文档。因此,将其添加到根架构文档中:

<xs:group name="Child">
<xs:sequence>
<xs:element ref="someOtherNs:ChildElement"
minOccurs="0"
maxOccurs="1" />
<xs:any processContents="lax"
minOccurs="0"
maxOccurs="unbounded"
namespace="##other" />
</xs:sequence>
</xs:group>

并更改引用自

<xsd:group ref="someOtherNs:Child" />

<xsd:group ref="someNs:Child" />

[非工作“解决方法”结束。现在,让我们再试一次。]

解决问题的一种方法,如果您确实希望您的工具解释 fullpersoninfo 中的通配符键入允许任何不在 second 中的元素命名空间,将移动类型 fullpersoninfo进入second命名空间。保持address等在 first命名空间,用 first 中的那些定义一个模型组命名空间:

<xs:group name="additional-person-info">
<xs:sequence>
<xs:element ref="address" ... />
...

声明fullpersoninfosecond命名空间:

<xsd:complexType name="fullpersoninfo">
<xsd:complexContent>
<xsd:extension base="someNs:personinfo">
<xsd:sequence>
<xsd:group ref="someNs:additional-person-info"/>
<xsd:group ref="someOtherNs:Child" />
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>

引用fullpersoninfo来自 employee 的声明以通常的方式:

<xsd:element name="employee" type="someOtherNs:fullpersoninfo" />

如果您决定不希望这样的元素有效,则需要采用不同的方法:

<employee xmlns="first" xmlns:x="second">
<firstname>Andrea</firstname>
<lastname>Doria</lastname>
<address/>
<city/>
<country/>
<firstname>Andrew</firstname>
<lastname>Carnegie</lastname>
</employee>

如果通配符匹配不在 first 中的任何内容,您可能会决定您实际上更喜欢它命名空间——但在那种情况下,{second}ChildElement匹配通配符,您根本不需要在内容模型中提及它。

您可能会决定您希望它匹配的是当前版本架构中未声明的任何内容——但为此,您需要在工具中支持 XSD 1.1。如果您有 1.1 意识,您所拥有的内容模型就不会被拒绝(尽管它仍然可能有一个让您感到惊讶的解释)。

关于java - 虚假唯一粒子属性 (UPA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25568532/

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