2012-09-24 4 views
0

nillable로하는 경우는 JiBX에 확인하는 방법 : JiBX에 의해 생성요소는 내가 스키마 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: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> 

및 자바 클래스를 :

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); 
    } 
} 

방법 요소가 nillable로 경우 내가 확인할 수 있나요? 이는 내가 XSD에 있습니다 nillable로 = "true"를

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

왜 당신이 그런 검사가 필요하십니까? 목표는 무엇입니까?실제 데이터에서 스키마 또는'xsi : nil = "true"'의 존재에 대해'nillable = "true"'가 있는지 확인하고 싶습니까? – Vadzim

+0

JAXB 내가 할 수있는 : if (elementType.getElement(). isNil()) {do something} 이제 요소가 nill (nillable = true) 인 경우 JIBX에서 동일한 작업을 수행해야합니다. – hudi

답변

0

는 현재 java.util.List<String> getSubElements()로 변환 xs:element name="SubSubElement" type="ListItemType" nillable="true" minOccurs="0"이 없다 .

결과 목록의 모든 null 값은 xml 데이터에서 <SubSubElement xsi:nil="true"/>에 해당합니다.

null을 목록에 표시하는 다른 방법은 없습니다.

그래서이 경우 null로 목록 항목을 검사하면 충분할 것으로 보입니다.

http://www.ibm.com/developerworks/xml/library/ws-tip-null/index.html#N10142을 참조하십시오.

업데이트

JiBX는 워드 프로세서 state

XSI의 : 또한 인스턴스 문서에 사용되는 무 속성은, JiBX는 1.0에서 지원하지 했다. JiBX 1.1은 object attribute 그룹의 nillable 속성을 사용하여이 기능에 대한 지원을 추가했습니다.

다음

이 속성은 요소의 이름에 바인드 된 개체와 함께 사용할 수 있습니다.

그러므로 원하는 검사는 전혀 매핑 할 수 없으므로 java.util.List<String> getSubElements()으로 매핑하십시오.

매핑을 java.util.List<SubElement> getSubElements()으로 변경할 수 있습니다. <SubSubElement/> 그러면 빈 인스턴스 SubElement에 매핑됩니다.

모든 JiBX 소스를 통한 빠른 전체 텍스트 검색은 nil check 가능성에 대한 개념을 나타내지 않았습니다. nillable에 대한 JiBX 지원은 특별한 마샬링 규칙에만 제한됩니다. 요소 바인딩 된 매핑에 대해서만 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은 null입니다. JAXB가 요소가 nillable인지를 지원하고 JIBX가이 기능을 구현하는 방법을 알아 내야합니다. – hudi

+0

아마도 뭔가를 놓치고 있을지 모르지만 차이가 나는 실질적인 이유는 무엇입니까? 및''? (어쩌면 빈 문자열 처리?) 둘 다 클라이언트 측에서 null로 매핑하지 않겠습니까? – Vadzim

+0

내 응용 프로그램에서 클라이언트가 요소에서 nillable을 사용하면 항목을 삭제하려고합니다. 그것이 비어있는 것을 보낼 때 나는 아무것도하지 않습니다. – hudi