XmlHttp内容序列化器按字母顺序排序字段

时间:2013-08-08 12:49:06

标签: java xml

我需要严格遵守xml文档中元素的顺序。如果我使用XmlHttpContent序列化程序来形成xml内容,则字段按字母顺序排序。

有没有办法明确指定xml中元素的顺序?或者是否有其他方法可以使用xml正文创建和发布http请求?

1 个答案:

答案 0 :(得分:1)

我知道这个答案并不理想,但我最近在尝试使用http客户端库序列化到xml时遇到了这个问题。解决方案我发现,我的DTO类提供了一种方法,可以将它们转换为某种类型的有序映射。

在我的情况下,这是一个ImmutableMap<String, Object>,因为我也使用Guava,但任何具有可控订单的地图都可以。基本的想法是使用java对象来构建数据,但是当它们序列化时,你会反而序列化地图。

public interface OrderedXml {
  ImmutableMap<String, Object> toOrderedMap();
}

public class Parent implements OrderedXml {
  @Key("First") String first;
  @Key("Second") String second;
  @Key("Child") Child third;

  @Override
  public ImmutableMap<String, Object> toOrderedMap() {
    return ImmutableMap.of(
      // the order of elements in this map will be the order they are serialised
      "First", first,
      "Second", second,
      "Child", third.toOrderedMap()
    );
  }
}

public class Child implements OrderedXml {
  @Key("@param1") String param1;
  @Key("@param2") String param2;
  @Key("text()") String value;

  @Override
  public ImmutableMap<String, Object> toOrderedMap() {
    return ImmutableMap.of(
      // the same goes for attributes, these will appear in this order
      "@param1", param1,
      "@param2", param2,
      "text()", value
    );
  }
}

public class Main {
  public static void main(String[] args) {
    // make the objects
    Parent parent = new Parent();
    parent.first = "Hello";
    parent.second = "World";
    parent.child = new Child();
    parent.child.param1 = "p1";
    parent.child.param2 = "p2";
    parent.child.value = "This is a child";
    // serialise the object to xml
    String xml = new XmlNamespaceDictionary()
        .toStringOf("Parent", parent.toOrderedXml()); // the important part
    System.out.println(xml); // should have the correct order
  }
}

我知道这个解决方案并不理想,但至少你可以重复使用toOrderedXml来制作一个不错的toString: - )。