Java JibX:如何映射类并避免将其作为XML节点输出
我正在使用Java对象到XML绑定工具 使用它,我希望有以下输出:Java JibX:如何映射类并避免将其作为XML节点输出,java,xml,data-binding,binding,Java,Xml,Data Binding,Binding,我正在使用Java对象到XML绑定工具 使用它,我希望有以下输出: <?xml version="1.0" encoding="UTF-8"?> <FEAPService> <Request> <Function>aaa</Function> <SubFunction>bbb</SubFunction> <Operation>ccc</Op
<?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>
我想这可以通过实现我自己的封送拆收器来实现,但我不确定这是否是最简单的方法。我成功地删除了不需要的XML节点,有两种方法: 简单的方法是:只需使用abstract=true属性。 核心方法:实现您自己的封送员。 第一种选择: 下面是我的binding.xml:
我设法删除了不需要的XML节点,有两种方法: 简单的方法是:只需使用abstract=true属性。 核心方法:实现您自己的封送员。 第一种选择: 下面是我的binding.xml:
基本摘要没有名称也很重要。基本摘要没有名称也很重要
<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>
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 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>