[英]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.