如何防止 XSD 中的空 XML 元素并使用 JAXB 进行验证?
How to prevent empty XML elements in XSD, and validate using JAXB?
为什么 JAXB 在解组期间生成的 Java 中未强制执行 minLength
约束?
我有以下元素
<subHeader seqno="1"><![CDATA[sub header1]]></subHeader>
并且我希望我的 XSD 能够防止空元素,例如这个
<subHeader seqno="2" />
当前 XSD:
<xsd:element name="subHeader" type="subHeaderType" minOccurs="0" maxOccurs="unbounded">
</xsd:element>
<xsd:complexType name="subHeaderType">
<xsd:simpleContent>
<xsd:extension base="NotEmpty">
<xsd:attribute name="seqno" type="xsd:string" use="required"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
<xsd:simpleType name="NotEmpty">
<xsd:restriction base="xsd:string">
<xsd:minLength value="1"></xsd:minLength>
<xsd:whiteSpace value="collapse"></xsd:whiteSpace>
</xsd:restriction>
</xsd:simpleType>
你的XSD将允许
<subHeader seqno="1"><![CDATA[sub header1]]></subHeader>
因为不为空但是防止
<subHeader seqno="2" />
因为是空.
因此,您的XSD已经满足您的要求了。
更新:评论中的 OP 提到查询实际上是关于 xsd:minLength
约束在解组期间未在 JAXB 中表示.
要根据您的 XSD 启用验证,请在您的 Unmarshaller
上设置 Schema
的实例。下面是通过 ValidationEventHandler
:
处理验证事件的示例
package blog.jaxb.validation;
import javax.xml.bind.ValidationEvent;
import javax.xml.bind.ValidationEventHandler;
public class MyValidationEventHandler implements ValidationEventHandler {
public boolean handleEvent(ValidationEvent event) {
System.out.println("\nEVENT");
System.out.println("SEVERITY: " + event.getSeverity());
System.out.println("MESSAGE: " + event.getMessage());
System.out.println("LINKED EXCEPTION: " + event.getLinkedException());
System.out.println("LOCATOR");
System.out.println(" LINE NUMBER: " + event.getLocator().getLineNumber());
System.out.println(" COLUMN NUMBER: " + event.getLocator().getColumnNumber());
System.out.println(" OFFSET: " + event.getLocator().getOffset());
System.out.println(" OBJECT: " + event.getLocator().getObject());
System.out.println(" NODE: " + event.getLocator().getNode());
System.out.println(" URL: " + event.getLocator().getURL());
return true;
}
}
代码来源:Blaise Doughan's blog,优秀的 JAXB 资源。
为什么 JAXB 在解组期间生成的 Java 中未强制执行 minLength
约束?
我有以下元素
<subHeader seqno="1"><![CDATA[sub header1]]></subHeader>
并且我希望我的 XSD 能够防止空元素,例如这个
<subHeader seqno="2" />
当前 XSD:
<xsd:element name="subHeader" type="subHeaderType" minOccurs="0" maxOccurs="unbounded">
</xsd:element>
<xsd:complexType name="subHeaderType">
<xsd:simpleContent>
<xsd:extension base="NotEmpty">
<xsd:attribute name="seqno" type="xsd:string" use="required"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
<xsd:simpleType name="NotEmpty">
<xsd:restriction base="xsd:string">
<xsd:minLength value="1"></xsd:minLength>
<xsd:whiteSpace value="collapse"></xsd:whiteSpace>
</xsd:restriction>
</xsd:simpleType>
你的XSD将允许
<subHeader seqno="1"><![CDATA[sub header1]]></subHeader>
因为不为空但是防止
<subHeader seqno="2" />
因为是空.
因此,您的XSD已经满足您的要求了。
更新:评论中的 OP 提到查询实际上是关于 xsd:minLength
约束在解组期间未在 JAXB 中表示.
要根据您的 XSD 启用验证,请在您的 Unmarshaller
上设置 Schema
的实例。下面是通过 ValidationEventHandler
:
package blog.jaxb.validation;
import javax.xml.bind.ValidationEvent;
import javax.xml.bind.ValidationEventHandler;
public class MyValidationEventHandler implements ValidationEventHandler {
public boolean handleEvent(ValidationEvent event) {
System.out.println("\nEVENT");
System.out.println("SEVERITY: " + event.getSeverity());
System.out.println("MESSAGE: " + event.getMessage());
System.out.println("LINKED EXCEPTION: " + event.getLinkedException());
System.out.println("LOCATOR");
System.out.println(" LINE NUMBER: " + event.getLocator().getLineNumber());
System.out.println(" COLUMN NUMBER: " + event.getLocator().getColumnNumber());
System.out.println(" OFFSET: " + event.getLocator().getOffset());
System.out.println(" OBJECT: " + event.getLocator().getObject());
System.out.println(" NODE: " + event.getLocator().getNode());
System.out.println(" URL: " + event.getLocator().getURL());
return true;
}
}
代码来源:Blaise Doughan's blog,优秀的 JAXB 资源。