簡體   English   中英

xsd:Java類中的唯一

[英]xsd:unique in a Java class

我的架構中的xsd:unique約束為幾個元素定義了主鍵和外鍵。

雖然架構不會引發任何錯誤。

生成Java類時,未添加xsd:unique

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xsd:import namespace="urn:schemas-microsoft-com:xml-msdata" schemaLocation="msdata.xsd" />
    <xsd:element name="root">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element maxOccurs="unbounded" name="subroot">
          <xsd:complexType>
            <xsd:sequence>
                   <xsd:element minOccurs="0" name="set">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:any processContents="lax" />
                    <xsd:choice>
                      <xsd:sequence>
                        <xsd:element maxOccurs="unbounded" name="Held">
                          <xsd:complexType>
                            <xsd:attribute name="_attr1" use="required" type="xsd:integer" />
                            <xsd:attribute name="_attr2" use="required" type="xsd:integer" />
                          </xsd:complexType>
                        </xsd:element>
                        <xsd:element maxOccurs="unbounded" name="Asses">
                          <xsd:complexType>
                            <xsd:attribute name="_attr2" use="required" type="xsd:integer" />
                            <xsd:attribute name="_attr3" use="required" type="xsd:NCName" />
                          </xsd:complexType>
                        </xsd:element>
                      </xsd:sequence>
                    </xsd:choice>
                  </xsd:sequence>
                </xsd:complexType>
                <xsd:unique name="PK_Held" msdata:PrimaryKey="true">
                  <xsd:selector xpath="xsd:Held"></xsd:selector>
                  <xsd:field xpath="@_attr1"></xsd:field>
                </xsd:unique>
                <xsd:unique name="PK_Asses" msdata:PrimaryKey="true">
                 <xsd:selector xpath="xsd:Asses"></xsd:selector>
                 <xsd:field xpath="@_attr2"></xsd:field>
                 </xsd:unique> 
                <xsd:keyref name="FK_Held_Asses" refer="PK_Asses">
                 <xsd:selector xpath="xsd:Held"></xsd:selector>
                 <xsd:field xpath="@_attr2"></xsd:field>
                 </xsd:keyref>
              </xsd:element>
            </xsd:sequence>
                </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>   

JAXB不執行驗證規則。

為了執行驗證規則,在解析 XML時需要指定XSD模式。

假設您要讓Unmarshaller為您解析XML,例如您沒有在對DOM節點進行解組,則可以這樣進行:

SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(schemaFile); // file or URL

JAXBContext jaxbContext = JAXBContext.newInstance();
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
unmarshaller.setSchema(schema);
unmarshaller.setEventHandler(handler); // To specify how validation errors should be handled
Object obj = unmarshaller.unmarshal(source);

這在Unmarshaller的javadoc中進行了描述:

驗證和格式正確

客戶端應用程序可以通過setSchema(javax.xml.validation.Schema) API啟用或禁用JAXP 1.3驗證機制。 復雜的客戶端可以指定他們自己的符合SAX 2.0的驗證解析器,並使用unmarshal(Source) API繞過JAXP 1.3驗證機制。

由於在JAXB 2.0中定義了將無效XML內容解組,因此與JAXB 1.0中相比,解組器默認驗證事件處理程序更為寬松。 當由JAXB 1.0綁定編譯器生成的派生於架構的代碼向JAXBContext注冊時,默認的解組驗證處理程序為DefaultValidationEventHandler並且在遇到致命錯誤或錯誤后將終止編組操作。 對於JAXB 2.0客戶端應用程序,沒有顯式定義的默認驗證處理程序,並且默認事件處理僅在遇到致命錯誤后才終止解組操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM