2012-09-24 68 views
0

我已經XSD架構:如何JIBX檢查元素可以爲空

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema 
    targetNamespace="urn:v1" 
    xmlns="urn:v1" 
    xmlns:reg="urn:v1" 
    xmlns:xop="http://www.w3.org/2004/08/xop/include" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified" 
    attributeFormDefault="unqualified" 
    version="1.1.1"> 

    <xs:simpleType name="ItemType">  
    <xs:restriction base="xs:string"> 

    </xs:restriction> 
    </xs:simpleType> 
    <xs:simpleType name="ListItemType"> 
    <xs:list itemType="ItemType"/> 
    </xs:simpleType> 

    <xs:complexType name="Element">  
    <xs:sequence> 
     <xs:element name="SubElement"> 
     <xs:complexType> 
      <xs:sequence> 
      <xs:element name="SubSubElement" type="ListItemType" nillable="true" minOccurs="0"/> 
      </xs:sequence> 
     </xs:complexType> 
     </xs:element> 
    </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

和Java類的JIBX產生:

public class Element 
{ 
    private java.util.List<String> subElements = new java.util.ArrayList<String>(); 

    /** 
    * Get the list of 'SubSubElement' element items. 
    * 
    * @return list 
    */ 
    public java.util.List<String> getSubElements() { 
     return subElements; 
    } 

    /** 
    * Set the list of 'SubSubElement' element items. 
    * 
    * @param list 
    */ 
    public void setSubElements(java.util.List<String> list) { 
     subElements = list; 
    } 

    /** 
    * Serializer for 'SubSubElement' element list. 
    * 
    * @param values 
    * @return text 
    */ 
    public static String serializeSubElements(java.util.List<String> values) { 
     if (values == null) { 
      return null; 
     } else { 
      java.lang.StringBuffer buff = new java.lang.StringBuffer(); 
      for (java.util.Iterator<String> iter = values.iterator(); iter 
        .hasNext();) { 
       if (buff.length() > 0) { 
        buff.append(' '); 
       } 
       String value = iter.next(); 
       buff.append(value); 
      } 
      return buff.toString(); 
     } 
    } 

    /** 
    * Deserializer for 'SubSubElement' element list. 
    * 
    * @param text 
    * @return values 
    * @throws org.jibx.runtime.JiBXException on conversion error 
    */ 
    public static java.util.List<String> deserializeSubElements(String text) 
      throws org.jibx.runtime.JiBXException { 
     org.jibx.runtime.IListItemDeserializer ldser = new org.jibx.runtime.IListItemDeserializer() { 
      public java.lang.Object deserialize(String text) { 
       return text; 
      } 
     }; 
     return (java.util.List<String>) org.jibx.runtime.Utility 
       .deserializeList(text, ldser); 
    } 
} 

如何我可以檢查是否元素可以爲空?這是我在XSD:的nillable = 「真」

UPDATE:

確定一些esier XSD沒有列表:

<xs:schema targetNamespace="urn:v1" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.1.1" xmlns="urn:v1" xmlns:reg="urn:v1" xmlns:xop="http://www.w3.org/2004/08/xop/include" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="Element"> 
     <xs:sequence minOccurs="0"> 
      <xs:element name="SubElement" type="type1" nillable="true" minOccurs="0"/> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:simpleType name="type1">   
     <xs:restriction base="xs:string" /> 
    </xs:simpleType> 

</xs:schema> 


public class Element 
{ 
    private String subElement; 

    /** 
    * Get the 'SubElement' element value. 
    * 
    * @return value 
    */ 
    public String getSubElement() { 
     return subElement; 
    } 

    /** 
    * Set the 'SubElement' element value. 
    * 
    * @param subElement 
    */ 
    public void setSubElement(String subElement) { 
     this.subElement = subElement; 
    } 
} 

又沒有的nillable

+0

爲什麼你需要這樣的檢查?目標是什麼?你的意思是檢查模式中是否存在「nillable =」true「或是否存在實際數據中的xsi:nil =」true「? JAXB中的 – Vadzim

+0

我可以這樣做:if(elementType.getElement()。isNil()){do something}現在我需要在JIBX中做同樣的事情,如果元素是nill(nillable = true)做一些事情 – hudi

回答

0

你在這裏xs:element name="SubSubElement" type="ListItemType" nillable="true" minOccurs="0"這相當於java.util.List<String> getSubElements()

結果列表中的每個空值將對應於xml數據中的<SubSubElement xsi:nil="true"/>

空值沒有其他實際的方式出現在列表中。

因此,在這種情況下,查看null列表項目似乎就足夠了。

請參閱http://www.ibm.com/developerworks/xml/library/ws-tip-null/index.html#N10142

更新

的JiBX文檔state

的XSI:無屬性,在實例文檔中也有使用,不通過 1.0 JiBX的支持。 JiBX 1.1使用 object attribute組中的nillable屬性添加了對此功能的支持。

然後

此屬性只能與被綁定到一個元素名稱的對象一起使用。

因此,所需的檢查絕對不可能,映射到java.util.List<String> getSubElements()

您可以將映射更改爲java.util.List<SubElement> getSubElements()。然後 <SubSubElement/>將映射爲空SubElement實例。

通過所有JiBX資源進行快速全文搜索沒有顯示出無檢查可能性的任何概念。 看來JiBX對nillable的支持僅限於特殊的編組規則。 假設nillable僅支持元素綁定映射,這很有意義。

例XSD

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema 
    targetNamespace="urn:v1" 
    xmlns="urn:v1" 
    xmlns:reg="urn:v1" 
    xmlns:xop="http://www.w3.org/2004/08/xop/include" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified" 
    attributeFormDefault="unqualified" 
    version="1.1.1"> 

    <xs:complexType name="SubElement">  
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     </xs:extension> 
    </xs:simpleContent>  
    </xs:complexType> 
    <xs:simpleType name="SubElementList"> 
    <xs:list itemType="SubElement"/> 
    </xs:simpleType> 
    <xs:complexType name="Element">  
    <xs:sequence> 
     <xs:element name="SubElement"> 
     <xs:complexType> 
      <xs:sequence> 
      <xs:element name="SubSubElement" type="SubElementList" nillable="true" minOccurs="0"/> 
      </xs:sequence> 
     </xs:complexType> 
     </xs:element> 
    </xs:sequence> 
    </xs:complexType> 
</xs:schema> 
+0

,你能解釋一下我如何區分?在這兩個XML列表爲空。 JAXB支持獲取元素是否可填寫,現在我需要找出JIBX如何實現這個功能 – hudi

+0

也許我錯過了一些東西,但是區別'和''? (處理空字符串可能?)無論如何都不會在客戶端映射到null? – Vadzim

+0

在我的應用程序中,當客戶端在元素中使用nillable時,我想刪除一些東西。當它發送空時,我什麼都不做。 – hudi