我在表单上有一个XML文档
<element>
<aaa></aaa>
<bbb></bbb>
<aaa></aaa>
</element>
我正在使用JAXB对POJO进行反序列化。
public class Pojo {
List<Aaa> aaaList;
List<Bbb> bbbList;
}
尽管aaa
和bbb
元素最终出现在两个不同的列表中,但我希望以后能够找出它们最初的顺序。
在反序列化XML时,是否可以在其兄弟姐妹中保存原始aaa
和bbb
元素的顺序?换句话说,有没有办法在int order
和Aaa
类上创建一个字段Bbb
,该字段会自动包含1
的{{1}} aaa
,{第一个2
的第一个bbb
和3
是{1}}?
答案 0 :(得分:1)
您可以在类Aaa
和Bbb
中包含一个字段,该字段指示xml在解组期间遍历xml时元素的位置,如:
public class Aaa
{
int position;
public int getPosition()
{
return position;
}
public void setPosition( int position )
{
this.position = position;
}
}
同样在班级Bbb.java
中进行。
现在为你的unmarshaller设置一个监听器,如:
jaxbUnmarshaller.setListener(new Listener()
{
private int position = 0;
@Override
public void beforeUnmarshal(Object target, Object parent)
{
if ( target instanceof Aaa )
{
position++;
Aaa aaa = (Aaa)target;
aaa.setPosition( position );
}
else if ( target instanceof Bbb )
{
position++;
Bbb bbb = (Bbb)target;
bbb.setPosition( position );
}
}
});
当JAXB解组xml时,将调用侦听器并在Aaa
和Bbb
对象中设置元素的位置。您可以使用getPosition()
检索它们。
以下代码将打印aaa
和bbb
代码的位置。
Elements data = (Elements) jaxbUnmarshaller.unmarshal( file );
List<Aaa> aaas = data.getAaa();
for ( Aaa aaa : aaas )
{
System.out.println( "aaa" + " " + aaa.getPosition() );
}
List<Bbb> bbbs = data.getBbb();
for ( Bbb bbb : bbbs )
{
System.out.println( "bbb" + " " + bbb.getPosition() );
}
输出:
aaa 1
aaa 3
bbb 2