如何防止 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 资源。