- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想为一个应用程序创建一个 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”。
更新:我刚刚注意到,根据@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/
我知道我以前在某个地方看到过这个,但我再也找不到它了。我需要一个从另一个 xsd 中调用 xsd 文件的示例。这在生成大量 xml 文件的情况下非常有用,但在这些 xml 文件之间存在大量公共(pub
有人知道供应商中立的 XSD 来描述关系数据库模式吗?我们的系统需要获取有关数据库结构的信息: 表 列和类型 主键和外键约束 索引 等 以独立于供应商的方式并将其存储在 XML 文件中以供以后处理。
我在 XSD 中使用 gml (3.1.1) XSD 作为我的应用程序。我想下载版本 3.1.1 中的所有 gml XSD,例如 zip 文件。换句话说:基本 xsd 是 here我想用 zip 文件
我想要一个 XSD 来验证包含具有许多别名但每个别名具有不同值的文件元素的 XML。 这是我的 XML: Document1
我看到一个 xml 架构 ( EPP ) 将 xsd:choice 与一个元素一起使用,即使我们可以使用 xsd:enumeration 代替:
我目前工作的公司将架构或契约(Contract)版本编入根节点。例如, ... 我正在寻找人们对这种设计方法的意见,因为我不相信它是合理的。例如,它要求所有使用此模式作为消息传递契约的服务都能够发
我在处理 Web 服务响应时遇到了 Apache CXF 解析错误。归结为一个空元素被返回: 元素定义如下: 现在我在 CXF 邮件列表上看到了 empty value is not allowe
XSD 可以为比较两个元素添加约束吗? 假设我在 DataRangeType 下有 Begin End 我想添加一个约束说 Begin 非常
我想声明一个要包含在复杂类型声明中的元素,并且该元素有一个强制属性:“option=MyOption”,但是“选项”属性的值可以是任何值,具体取决于上下文。 也就是说:在使用包含该元素的复杂类型的任何
我需要能够将简单元素类型设置为整数,但也可以将其设置为空。如果此示例为空且空白字段不是整数,则此示例将发送错误。我该如何解决? 最佳答案 您要做的是在同一元素上分配限制,并对其进行合并,例如以下示例
对于这个 xml: 我有这个模式,它似乎可以根据 w3 schema validation service 进行验证,并且该架构可以很好地验证上述 XML。遗憾的是,xsd.exe
我有两个 XSD 文件(源文件和目标文件)...我应该在什么基础上映射这两个文件以获得 XSLT?我知道 MapForce 如何帮助映射,但我使用示例项目..现在我想知道我应该在什么基础上映射我的客户
我有一个 .cs 文件,其中包含 XTypedElement 和 IXMetaData 的子类。微软有一个 tool that generates XSD files automatically来自托
这个问题在这里已经有了答案: XML Schema to validate XML Schemas? (3 个答案) 关闭 9 年前。 是否存在可验证其他 XML 架构的 Xml 架构? 我想做的是
假设我正在处理一个 xsd:simpleType,它是一个字符串,需要具有特定的字符集和特定的最大长度,类似于以下代码: 所以我的 xsd 类型将是一个只
JAXB 同时映射 xsd:base64Binary和 xsd:hexBinary类型为 byte[] . 鉴于我有一个架构/DOM 元素代表这些类型中的每一个,例如: ABCD对于 xsd:hexB
我非常确定我在这里遗漏了一些简单的东西。 我正在使用 netbeans 在两个单独的项目中创建一个 web jax-ws web 服务和一个客户端,并且我有一些自定义绑定(bind)已使用 net b
将字节数组表示为 XSD 架构的最佳方式是什么?我有一个字节输入,我需要解析它并将其提供给 JAXB 从 XSD 模式生成的 Java 对象以供将来验证。我输入中的每条信息都由偏移量和长度定义。我想将
我的架构的这一部分给我带来了麻烦:
我需要定义元素“MyData”的名为“DataValue”的属性。但要求是“DataValue”的类型可以动态更改,即数据值在一个实例中可以是字符串,而在其他实例中它可以是 int 或 bool。它可
我是一名优秀的程序员,十分优秀!