在反序列化时保存元素在其兄弟之间的顺序

时间:2017-06-01 14:42:45

标签: java xml jaxb

我在表单上有一个XML文档

<element>
   <aaa></aaa>
   <bbb></bbb>
   <aaa></aaa>
</element>

我正在使用JAXB对POJO进行反序列化。

public class Pojo {
   List<Aaa> aaaList;
   List<Bbb> bbbList;
}

尽管aaabbb元素最终出现在两个不同的列表中,但我希望以后能够找出它们最初的顺序。

在反序列化XML时,是否可以在其兄弟姐妹中保存原始aaabbb元素的顺序?换句话说,有没有办法在int orderAaa类上创建一个字段Bbb,该字段会自动包含1的{​​{1}} aaa,{第一个2的第一个bbb3是{1}}?

1 个答案:

答案 0 :(得分:1)

您可以在类AaaBbb中包含一个字段,该字段指示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时,将调用侦听器并在AaaBbb对象中设置元素的位置。您可以使用getPosition()检索它们。

以下代码将打印aaabbb代码的位置。

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