非常概括和简化的场景描述:
现在,模式定义了复杂的类型A,B和C.模式指定XML文档必须具有顶级元素A,并且这可以包含多个B,并且可以选择包含C.我为B创建JAXB实例并且绝对想要在将其嵌套到A之前,对XSD中的复杂类型定义进行验证。但是,如果我对整个XSD进行验证,则验证此操作将失败。
问题:如何仅针对从中生成其类的XSD的一部分验证JAXB实例?
如何使用schemagen从JAXB类生成模式,我要验证哪个实例,然后对其进行验证?你认为那可行吗?还有其他想法吗?
我以前没有使用schemagen的经验,很快就会开始对这个解决方案进行原型设计。
注意:实际上,模式并不像上面的例子那么简单,并且创建一些总是有效的模拟A的解决方案不可行。更不用说这种验证至少可以说是百位。
答案 0 :(得分:1)
为要验证的元素创建单独的架构,此元素位于根级别。 解决方法缺少@xmlRoottag,请参阅101 ways to marshal objects with JAXB
答案 1 :(得分:0)
事实证明,使用xsi:type让我们完成这个。
答案 2 :(得分:0)
在使用isPrefLabel()
和xjc
工具时,请考虑我们在java中使用的相同概念。在java中,每个类都是一个骨架,而对象是一个实例。我们需要将XSD视为骨架,将XML视为实例。
xjc工具: -
schemagen
或Xsd to Java Class
例如,考虑以下带有名称空间的XSD。 Unmarshaling
工具将生成java类以及package-info和object-factory。
xjc
使用以下命令
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ir="http://irctc.org/service" targetNamespace="http://irctc.org/service">
<xsd:element name="Customer" type="ir:CustomerType"/>
<xsd:complexType name="CustomerType">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="src" type="xsd:string"/>
<xsd:element name="dest" type="xsd:string"/>
<xsd:element name="price" type="xsd:float" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
注意: - 如果您有多个java类,则可以使用D:\>xjc Customer.xsd
parsing a schema...
compiling a schema...
org\irctc\service\CustomerType.java
org\irctc\service\ObjectFactory.java
org\irctc\service\package-info.java
文件而不是jaxb.index
。
schemagen工具: -
ObjectFactory.java
或Java Class to Xsd
让我们假设我们想要使用java类生成Xsd文件然后首先我们需要在我们拥有{的同一个包中创建Marshaling
或ObjectFactory.java
文件和jaxb.index
{1}}。
package-info.java
使用以下命令
CustomerType.java
上面的命令将生成xsd文件。 java类的包将被视为xsd名称空间。
package org.irctc.service;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlRootElement("Customer")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "CustomerType", propOrder = {
"name",
"src",
"dest",
"price"
})
public class CustomerType {
@XmlElement(required = true)
protected String name;
@XmlElement(required = true)
protected String src;
@XmlElement(required = true)
protected String dest;
protected Float price;
public String getName() {
return name;
}
public void setName(String value) {
this.name = value;
}
public String getSrc() {
return src;
}
public void setSrc(String value) {
this.src = value;
}
public String getDest() {
return dest;
}
public void setDest(String value) {
this.dest = value;
}
public Float getPrice() {
return price;
}
public void setPrice(Float value) {
this.price = value;
}
}
D:\>schemagen org.irctc.service.CustomerType
Note: Writing D:\schema1.xsd