gpt4 book ai didi

jaxb - XSD 允许扩展、兼容性和验证

转载 作者:行者123 更新时间:2023-12-02 02:11:22 26 4
gpt4 key购买 nike

我想为一个应用程序创建一个 XSD,另一个 XSD 扩展第一个(仅通过添加元素)。

我希望第二个应用程序生成的 XML 文件对第一个应用程序有效。

我试过这个:

第一个 XSD:

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns="example"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="example"
elementFormDefault="qualified" attributeFormDefault="qualified">

<xs:complexType name="typeA">
<xs:sequence>
<xs:element name="elA" type="xs:string" />
<xs:any namespace="##any" minOccurs="0" processContents="lax" />
</xs:sequence>
</xs:complexType>

<xs:element name="root" type="typeA" />
</xs:schema>

第二个 XSD:

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns="example"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="example">
<xs:redefine schemaLocation="firstXSD.xsd">
<xs:complexType name="typeA">
<xs:complexContent>
<xs:extension base="typeA">
<xs:sequence>
<xs:element name="newElement" type="xs:string" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:redefine>
</xs:schema>

必须对第一个 XSD(而非第二个)有效的 XML 示例:

<?xml version="1.0" encoding="UTF-8" ?>
<root xmlns="example">
<elA>MyString</elA>
</root>

必须对两者 XSD 都有效的 XML 示例

 <?xml version="1.0" encoding="UTF-8" ?>
<root xmlns="example">
<elA>MyString</elA>
<newElement>MyNewString</newElement>
</root>

之前的 XSD 违反了“唯一粒子属性”,我希望修复此问题。我可以编辑两个 XSD,但我希望能够在完成第二个之前分发第一个。

我怎样才能做到这一点(JAXB 检查时两个模式都必须有效)?

谢谢

最佳答案

有些人可能会说:如果你可以编辑两个 XSD,为什么还要重新定义呢?

我将向您展示如何使它与 XSD 重新定义一起工作,至少从 XSD 的角度来看是这样。但是,考虑到 JAXB 的限制,它不能开箱即用。如果您还使用自动 XSD 重构,作为一个额外的步骤,那么您可以让它发挥作用,并且在此过程中,您将保留在使用 xsd:redefine 时看到的值(value)主张。

因此,在此之前,这是另一种也使用组合的方法,但没有 xsd:redefine;从维护和验证的角度来看,您将获得大致相同的值(value)和用法。

我将您的第一个 XSD 称为 Model1,将您的第二个 XSD 称为 Model2。我将从一个 XSD 开始,它将为您提供 xs:redefine 所具有的“通过组合重用”方面。

通用项,xsd-allow-extension-compatibility-and-validation-common-items.xsd:

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com)-->
<xs:schema xmlns="example"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="example"
elementFormDefault="qualified" attributeFormDefault="qualified">

<xs:group name="typeA">
<xs:sequence>
<xs:element name="elA" type="xs:string" />
</xs:sequence>
</xs:group>

<xs:element name="root" type="typeA" />
</xs:schema>

Model1“项目”,xsd-allow-extension-compatibility-and-validation-model1-items.xsd:

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com)-->
<xs:schema xmlns="example"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="example"
elementFormDefault="qualified" attributeFormDefault="qualified">

<xs:complexType name="typeA">
<xs:sequence>
<xs:group ref="typeA" />
<xs:any namespace="##any" minOccurs="0" processContents="lax" />
</xs:sequence>
</xs:complexType>
</xs:schema>

Model2“项目”,xsd-allow-extension-compatibility-and-validation-model2-items.xsd:

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com)-->
<xs:schema xmlns="example"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="example"
elementFormDefault="qualified" attributeFormDefault="qualified">

<xs:complexType name="typeA">
<xs:sequence>
<xs:group ref="typeA" />
<xs:element name="newElement" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:schema>

如果您将 Common Items 和 Model1,或 Common Items 和 Model2 传递给 JAXB 编译器,它将完全按照您想要的方式创建类。为了便于使用(测试)和说明,我创建了另外两个 XSD:

模型 1:

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com)-->
<xs:schema xmlns="example"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="example"
elementFormDefault="qualified" attributeFormDefault="qualified">
<xs:include schemaLocation="xsd-allow-extension-compatibility-and-validation-common-items.xsd"/>
<xs:include schemaLocation="xsd-allow-extension-compatibility-and-validation-model1-items.xsd"/>
</xs:schema>

模型 2:

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com)-->
<xs:schema xmlns="example" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="example" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="xsd-allow-extension-compatibility-and-validation-common-items.xsd"/>
<xs:include schemaLocation="xsd-allow-extension-compatibility-and-validation-model2-items.xsd"/>
</xs:schema>

这是当您再次对 Model1 运行 xjc 时得到的结果:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "typeA", propOrder = {
"elA",
"any"
})
public class TypeA {

@XmlElement(required = true)
protected String elA;
@XmlAnyElement(lax = true)
protected Object any;

/**
* Gets the value of the elA property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getElA() {
return elA;
}

/**
* Sets the value of the elA property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setElA(String value) {
this.elA = value;
}

/**
* Gets the value of the any property.
*
* @return
* possible object is
* {@link Element }
* {@link Object }
*
*/
public Object getAny() {
return any;
}

/**
* Sets the value of the any property.
*
* @param value
* allowed object is
* {@link Element }
* {@link Object }
*
*/
public void setAny(Object value) {
this.any = value;
}

}

...当您再次对 Model2 运行 xjc 时:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "typeA", propOrder = {
"elA",
"newElement"
})
public class TypeA {

@XmlElement(required = true)
protected String elA;
@XmlElement(required = true)
protected String newElement;

/**
* Gets the value of the elA property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getElA() {
return elA;
}

/**
* Sets the value of the elA property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setElA(String value) {
this.elA = value;
}

/**
* Gets the value of the newElement property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getNewElement() {
return newElement;
}

/**
* Sets the value of the newElement property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setNewElement(String value) {
this.newElement = value;
}

}

Model1 和 Model2 XSD 将完全按照您的预期方式验证您的 XML。

下图显示了 XSD 文件之间的关系。绿色表示“xsd:include”,箭头指向“included”。

QTAssistant XSD file diagram

更新:我刚刚注意到,根据@Kevin 的评论,您在重新定义的新元素上没有 maxOccurs。在这种情况下,您可以使用一个单独的重新定义,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XSR Module (http://www.paschidev.com)-->
<xsd:schema xmlns="example" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="example" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:redefine schemaLocation="xsd-allow-extension-compatibility-and-validation.xsd">
<xsd:complexType name="typeA">
<xsd:complexContent>
<xsd:restriction base="typeA">
<xsd:sequence>
<xsd:element name="elA" type="xsd:string" />
<xsd:element name="newElement" type="xsd:string" />
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:redefine>
</xsd:schema>

唯一的问题似乎是 JAXB(最新)仍然使用通配符生成类。

更新2:根据Kevin的评论,两个避免了两个重新定义,应该使用一个组而不是xsd:any。

如果您实际上计划使用多个元素来扩展新模型,请继续阅读。下面是唯一的方法,它需要使用一个组来进一步细化任何粒子。

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XSR Module (http://www.paschidev.com)-->
<xsd:schema xmlns="example" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="example" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:redefine schemaLocation="xsd-allow-extension-compatibility-and-validation.xsd">
<xsd:complexType name="typeA">
<xsd:complexContent>
<xsd:restriction base="typeA">
<xsd:sequence>
<xsd:element name="elA" type="xsd:string" />
<xsd:group ref="group1" minOccurs="0">
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:redefine>
<xsd:group name="group1">
<xsd:sequence>
<xsd:element name="newElement" type="xsd:string" />
</xsd:sequence>

</xsd:group>
</xsd:schema>

最终结果是新的 XSD 可用于验证 Model1,而原始文件仍为 Model1。

关于jaxb - XSD 允许扩展、兼容性和验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12588301/

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