2009-02-27 4 views
2

Ich verwende JibX als ein Java-Objekt für XML-Binding-Tool.JibX: Wie man eine Klasse abbildet und vermeidet, dass sie als XML-Knoten ausgegeben wird

Damit ich die folgende Ausgabe haben wollen:

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

Aber ich bin immer dies:

<?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> 

Hier ist die JiBX Einbindemappe:

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

I Ich vermute, es könnte durch die Implementierung meines eigenen Marshallers erreicht werden, aber ich bin mir nicht sicher, ob das der einfachste Weg ist.

Antwort

0

ich den unerwünschten XML-Knoten entfernen verwaltet wird, gibt es 2 Möglichkeiten:

  1. der einfache Weg: Verwenden Sie nur die abstrakte = „true“ -Attribut.
  2. der hardcore Weg: implementieren Sie Ihre eigenen Marshaller.

1. Option:

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

2. Option: Ihre eigenen implementieren 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); 
    } 
} 

Und hier ist mein 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

Es ist auch wichtig, dass die Basis (Zusammenfassung) nicht einen Namen haben.

Verwandte Themen