我需要严格遵守xml文档中元素的顺序。如果我使用XmlHttpContent序列化程序来形成xml内容,则字段按字母顺序排序。
有没有办法明确指定xml中元素的顺序?或者是否有其他方法可以使用xml正文创建和发布http请求?
答案 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
: - )。