2

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

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

4

1 回答 1

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

于 2014-04-24T08:13:07.387 回答