如何防止XSD中的空XML元素,并使用JAXB进行验证?

时间:2016-06-23 19:30:22

标签: xml xsd jaxb unmarshalling

为什么在解组时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> 

1 个答案:

答案 0 :(得分:0)

您的XSD将允许

<subHeader seqno="1"><![CDATA[sub header1]]></subHeader>

因为 不为空 ,但阻止了

<subHeader seqno="2" />

因为 为空

因此,您的XSD已经满足您的要求。

更新:评论中的OP提到该查询实际上是关于在解组期间未在JAXB中表示的 xsd:minLength约束。

要为您的XSD启用验证,请在Schema上设置Unmarshaller的实例。以下是通过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资源。