我需要严格遵守 xml 文档中元素的顺序。如果我使用 XmlHttpContent 序列化程序来形成 xml 内容,则字段按字母顺序排序。
有没有办法明确指定xml中元素的顺序?还是有其他方法可以使用 xml 正文创建和发布 http 请求?
我知道这个答案并不理想,但我最近在尝试使用 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
。