您的位置:首页 > 编程语言 > Java开发

基于jibx解析xml中有很多field的xml

2013-11-27 16:30 337 查看
接上篇,对于xml中含有重复field的xml解析使用xml解析工具比较简单,使用绑定工具就要稍作修改。如下xml:

<entryList>
<field name="userName">yinlei</field>
<field name="age">19</field>
</entryList>

如果使用jibx来绑定,需要另外写一个映射器,用来出来这中xml.
使用下面这个POJO来映射上述xml

public class Field {
private String name;
private String value;

public Field() {
super();
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getValue() {
return value;
}

public void setValue(String value) {
this.value = value;
}
}jibx的绑定映射文件这样来写,指定具体的marshaller和unmarshaller:
<collection field="entryList" name="entryList" usage="optional" create-type="java.util.ArrayList"><!-- name属性就是xml的外层属性 -->
<structure type="com.hch.testjibx.Field" name="field" marshaller="com.hch.testjibx.FieldMapper" unmarshaller="com.hch.testjibx.FieldMapper">
</structure>
</collection>

marshaller和unmarshaller的值就是你要实现的映射类:
import org.jibx.runtime.IAliasable;
import org.jibx.runtime.IMarshaller;
import org.jibx.runtime.IMarshallingContext;
import org.jibx.runtime.IUnmarshaller;
import org.jibx.runtime.IUnmarshallingContext;
import org.jibx.runtime.JiBXException;
import org.jibx.runtime.impl.MarshallingContext;
import org.jibx.runtime.impl.UnmarshallingContext;

public class FieldMapper implements IMarshaller, IUnmarshaller, IAliasable {
private String uri;
private int index;
private String fieldName;

public FieldMapper() {
super();
this.uri = null;
this.index = 0;
this.fieldName = "field";
}

public FieldMapper(String uri, int index, String fieldName) {
super();
this.uri = uri;
this.index = index;
this.fieldName = fieldName;
}

@Override
public boolean isPresent(IUnmarshallingContext context) throws JiBXException {
return context.isAt(uri, fieldName);
}

@Override
public Object unmarshal(Object object, IUnmarshallingContext context)
throws JiBXException {
Field field = (Field) object;
if (field == null) {
field = new Field();
}
UnmarshallingContext ctx = (UnmarshallingContext) context;
//ctx.getText();//要解析的这段xml字符串
String name = ctx.attributeText(uri, getAttrName());//按属性名取属性值
//ctx.getAttributeValue(0);//按照顺序取属性值
//ctx.getAttributeCount();//属性数量
field.setName(name);

ctx.parsePastStartTag(uri, fieldName);//开始解析
String value = ctx.parseContentText();
//ctx.getText();
//ctx.getName();
ctx.parsePastEndTag(uri, fieldName);//解析后要关闭
field.setValue(value);
return field;
}

@Override
public boolean isExtension(String arg0) {
return false;
}

@Override
public void marshal(Object source, IMarshallingContext context)
throws JiBXException {
Field field = (Field) source;
MarshallingContext ctx = (MarshallingContext) context;
ctx.startTagAttributes(index, fieldName);
ctx.attribute(index, getAttrName(), field.getName()).closeStartContent();
ctx.content(field.getValue());
ctx.endTag(index, fieldName);
}

public String getAttrName() {
return "name";
}

}

这样,jibx在遇到Field类时,就会使用你指定的解码和编码器
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xml java jibx