0

私は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>

およびJIBXによって生成されたJavaクラス:

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"

アップデート:

リストなしでいくつかのesierxsdをOK:

<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はありません

4

1 に答える 1

0

ここxs:element name="SubSubElement" type="ListItemType" nillable="true" minOccurs="0"に、に変換されるものがありjava.util.List<String> getSubElements()ます。

結果のリストのすべてのnull値は<SubSubElement xsi:nil="true"/>、xmlデータに対応します。

nullをリストに表示する他の実用的な方法はありません。

したがって、この場合、リスト項目のnullをチェックするだけで十分のようです。

http://www.ibm.com/developerworks/xml/library/ws-tip-null/index.html#N10142を参照してください。

アップデート

JiBXドキュメントの状態

インスタンスドキュメントでも使用されるxsi:nil属性は、JiBX1.0ではサポートされていませんでした。JiBX 1.1は、オブジェクト属性グループのnillable属性を使用して、この機能のサポートを追加しました。

その後

この属性は、要素名にバインドされているオブジェクトでのみ使用できます。

したがって、へのマッピングでは、目的のチェックはまったく不可能java.util.List<String> getSubElements()です。

マッピングをに変更できますjava.util.List<SubElement> getSubElements()<SubSubElement/>その場合、空のSubElementインスタンスにマップされます。

すべてのJiBXソースをすばやく全文検索しても、nilチェックの可能性についての概念は表示されませんでした。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>
于 2012-09-26T14:46:13.073 に答える