用Java排序XML

您好我有一个类似于下面的XML,需要使用日期字段进行排序。

                          

我想根据日期(比如asc顺序)对XML进行排序,而不管日期是在Node1还是Node2下。 实际上在Java代码中我有两个单独的列表,一个是Node1对象,另一个是Node2对象。 我可以在java中以任意顺序对列表进行排序。 但是我需要对日期进行排序,而不管它在XML上出现的节点。 在Java中以这种方式排序的最佳方法是什么?

实际上我使用Castor将java对象编组为XML。 如果你知道这可以用Castor完成,那就太棒了!

我使用XSLT,它有排序日期的probs,你需要工作,最简单的方法,如果你可以控制它是有可排序的日期格式,如yyyymmdd

               

如果您希望排序结果为单个列表,按日期排序,则必须将所有节点放入单个List数组中。 如果两种类型(node1和node2)扩展了公共基类,则可以使用Java的generics列表。

 List nodes = new ArrayList(); nodes.add(node1); nodes.add(node2); Node[] nodeArrayToSort = nodes.toArray(); 

如果两个节点类型不从公共类inheritance,则只需使用对象列表。

现在你必须编写自己的比较器。 这是一个例子,如果节点类型确实有一个包含Date字段的公共超类,你可以使用它。

 public class NodeComparator implements Comparator { @Override public int compare(Node node1, Node node2) { return node1.getDate().compare(node2.getDate()); } } 

既然您拥有自定义比较器和包含所有节点的数组,那么只需一行Java代码就可以对列表进行排序。

 Arrays.sort(nodeArrayToSort, new NodeComparator()); 

如果您想了解有关它的行为的任何其他信息,可以在此处找到上述方法的javadoc。

使用上面的方法,很容易看出如何编写任何类型的比较函数来改变排序的行为。 您也可以编写尽可能多的自定义Comparator类,以便在运行时切换它们。 希望这可以帮助! 🙂

我使用过XSLT和XALAN。

XSL如下所示。日期的格式为mm / dd / yyyy

                    

而java代码是

 import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; /** * Use the TraX interface to perform a transformation in the simplest manner possible * (3 statements). */ public class SimpleTransform { public static void main(String[] args) throws TransformerException, TransformerConfigurationException, FileNotFoundException, IOException { // Use the static TransformerFactory.newInstance() method to instantiate // a TransformerFactory. The javax.xml.transform.TransformerFactory // system property setting determines the actual class to instantiate -- // org.apache.xalan.transformer.TransformerImpl. TransformerFactory tFactory = TransformerFactory.newInstance(); // Use the TransformerFactory to instantiate a Transformer that will work with // the stylesheet you specify. This method call also processes the stylesheet // into a compiled Templates object. Transformer transformer = tFactory.newTransformer(new StreamSource("sort.xsl")); // Use the Transformer to apply the associated Templates object to an XML document // (foo.xml) and write the output to a file (foo.out). transformer.transform(new StreamSource("root.xml"), new StreamResult(new FileOutputStream("out.xml"))); System.out.println("************* The result is in birds.out *************"); } }