2009-02-27 53 views
2

我正在使用JibX作爲Java對象到XML綁定工具。JibX:如何映射類並避免它作爲XML節點輸出

有了它,我想有以下輸出:

<?xml version="1.0" encoding="UTF-8"?> 
<FEAPService> 
    <Request> 
     <Function>aaa</Function> 
     <SubFunction>bbb</SubFunction> 
     <Operation>ccc</Operation> 
    </Request> 
</FEAPService> 

但我發現了這一點:

<?xml version="1.0" encoding="UTF-8"?> 
<FEAPService> 
    <Request> 
     <baseForm> <!-- I DO NOT WANT THIS baseForm TAG --> 
      <Function>aaa</Function> 
      <SubFunction>bbb</SubFunction> 
      <Operation>ccc</Operation> 
     </baseForm> 
    </Request> 
</FEAPService> 

這裏的JiBX綁定文件:

<binding name="requestBinding_com_struts_form_SpecificForm"> 
    <mapping name="baseForm" class="com.struts.form.BaseForm"> 
     <value name="Function" field="function" /> 
     <value name="SubFunction" field="subFunction" /> 
     <value name="Operation" field="operation" /> 
    </mapping>  
    <mapping name="FEAPService" class="com.struts.form.SpecificForm" 
     extends="com.struts.form.BaseForm"> 
     <structure name="Request"> 
      <structure map-as="com.struts.form.BaseForm" /> 
     </structure> 
    </mapping> 
</binding> 

我猜測可能通過實施我自己的Marshaller來實現,但我不確定這是否是最簡單的方法。

回答

0

我設法除去不需要的XML節點,有2種方式:

  1. 簡單的方法:只使用抽象=「true」屬性。
  2. 硬核方式:實現你自己的編組。

第一種選擇:

<mapping class="com.struts.form.BaseForm" abstract="true"> 
     <value name="Function" field="function" /> 
     <value name="SubFunction" field="subFunction" /> 
     <value name="Operation" field="operation" /> 
     <value name="doubleField_part1" field="doubleField" serializer="com.struts.form.BaseForm.doubleFieldDeserializer1" /> 
     <value name="doubleField_part2" field="doubleField" serializer="com.struts.form.BaseForm.doubleFieldDeserializer2" /> 
    </mapping> 

第二個選項:實現自己的Marshaller

public class MyMarshaller implements IMarshaller { 
    private static final String FUNCTION_ELEMENT_NAME = "Function"; 
    private static final String SUB_FUNCTION_ELEMENT_NAME = "SubFunction"; 
    private static final String OPERATION_ELEMENT_NAME = "Operation"; 

    private String m_uri; 
    private int m_index; 
    private String m_name; 

    public MyMarshaller() { 
     m_uri = null; 
     m_index = 0; 

     m_name = "Function"; 
    } 

    public MyMarshaller(String uri, int index, String name) { 
     m_uri = uri; 
     m_index = index; 
     m_name = name; 
    } 

    public boolean isExtension(int index) { 
     return false; 
    } 

    public void marshal(Object obj, IMarshallingContext ictx) 
      throws JiBXException { 

     // make sure the parameters are as expected 
     if (!(obj instanceof BaseForm)) { 
      throw new JiBXException("Invalid object type for marshaller"); 
     } else if (!(ictx instanceof MarshallingContext)) { 
      throw new JiBXException("Invalid object type for marshaller"); 
     } else { 
      // start by generating start tag for container 
      MarshallingContext ctx = (MarshallingContext) ictx; 
      BaseForm formBean = (BaseForm) obj; 

      /* 
      * THIS CODE COULD BE REPEATED FOR ALL FormBean CLASS' ATTRIBUTE USING REFLECTION. 
      * And to control which attributes should be marshalled the attributes could follow special nomeclatures. 
      * Ex. 
      * class FormBean { 
      * String marshallable_Function; 
      * String non_marshallable_Function; 
      * } 
      */ 
      writeTag(ctx, formBean.getFunction(), FUNCTION_ELEMENT_NAME); 
      writeTag(ctx, formBean.getSubFunction(), SUB_FUNCTION_ELEMENT_NAME); 
      writeTag(ctx, formBean.getOperation(), OPERATION_ELEMENT_NAME); 
     } 
    } 

    private void writeTag(MarshallingContext ctx, String value, String entryElementName) 
      throws JiBXException { 
     ctx.startTag(m_index, entryElementName); 
     ctx.closeStartContent(); 
     ctx.content(value); 
     ctx.endTag(m_index, entryElementName); 
    } 
} 

這裏是我的binding.xml

<binding name="requestBinding_com_struts_form_SpecificForm"> 
    <mapping class="com.struts.form.BaseForm" marshaller="example8.MyMarshaller" />   
    <mapping name="FEAPService" class="com.struts.form.SpecificForm"> 
     <structure name="Request"> 
      <structure map-as="com.struts.form.BaseForm" /> 
     </structure> 
    </mapping> 
</binding> 
0

同樣重要的是,基地(摘要)有一個名字。

相關問題