2010-05-26 142 views
6

您好,我有一個類似於下面的XML,它需要使用日期字段進行排序。用Java對XML進行排序

<root> 
    <Node1> 
     <date></date> 
    </Node1> 
    <Node1> 
     <date></date> 
    </Node1> 
    <Node1> 
     <date></date> 
    </Node1> 
    <Node1> 
     <date></date> 
    </Node1> 
    <Node2> 
     <date></date> 
    </Node2> 
    <Node2> 
     <date></date> 
    </Node2> 
    <Node2> 
     <date></date> 
    </Node2> 
    <Node2> 
     <date></date> 
    </Node2> 
</root> 

我想排序依據的日期(比如ASC順序)的XML,而不論該日期是否節點1或節點2下。實際上,在Java代碼中,我有兩個獨立的列表,其中一個使用Node1對象,另一個使用Node2對象。我可以在Java內部以任何順序對列表進行排序。但是我需要將日期排序,而不管它在XML上出現的節點。 在Java中對這種方式進行排序的最佳方法是什麼?

Actaully我正在使用Castor將java對象編組爲XML。如果你知道這可以通過Castor完成,那將非常棒!

+0

謝謝! Justin .. – 2010-05-26 22:40:27

+0

XML是「意思」是一個集合,所以按照升序排序數據並不是「有意」的有用...... – blissapp 2010-05-26 22:49:04

+4

@blissapp - 訂單是XML的基礎,抽象模型是一個序列。 xpath 2.0/xquery的基礎。也許你正在考慮關係數據? – mdma 2010-05-26 23:28:54

回答

2

我會使用XSLT,它與排序日期probs,你將需要全面工作,如果你能控制最簡單的方法是有排序的日期格式像年月日

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:template match="root"> 
    <xsl:copy> 
     <xsl:apply-templates> 
      <xsl:sort data-type="number" select="date"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="*"> 
     <xsl:copy> 
      <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 
+0

謝謝.... ........ – 2010-05-27 16:59:42

+0

我有同樣的情況 - 但日期格式不同 - 像2015-12-27T16:44:07,所以在這種情況下怎麼辦 – 2015-12-02 11:53:01

0

,如果您就像排序結果是單個列表一樣,按日期排序,那麼你必須把所有的節點放到一個數組中。如果這兩種類型(節點1 & node2)擴展了一個公共基類,則可以使用Java的泛型爲您列出。

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

如果兩個節點類型不從普通類繼承,那麼可以簡單地使用對象列表。

現在您將不得不編寫自己的比較器。這裏是一個你可以使用的例子,如果節點類型有一個包含Date字段的公共超類。現在,你有你的自定義比較,並與您的所有節點的陣列

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

,它是Java代碼一行對列表進行排序。

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

用於上述方法的Javadoc可以發現here如果您想任何附加信息上的行爲。

使用上述方法,很容易看出如何編寫任何類型的比較函數來改變排序行爲。您也可以根據需要編寫儘可能多的自定義比較器類,以便在運行時切換它們。希望這可以幫助! :)

0

我使用了XSLT和XALAN。

XSL如下所示..日期的格式是MM/DD/YYYY

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:template match="root"> 
<xsl:copy> 
<xsl:apply-templates> 
<xsl:sort data-type="number" select="substring(date,7,4)"/> <!-- year sort --> 
<xsl:sort data-type="number" select="substring(date,1,2)"/> <!-- day sort --> 
<xsl:sort data-type="number" select="substring(date,4,2)"/> <!-- month sort --> 
</xsl:apply-templates> 
</xsl:copy> 
</xsl:template> 
<xsl:template match="*"> 
<xsl:copy> 
<xsl:apply-templates/> 
</xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 

和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 *************"); 
    } 
} 
+0

很酷,很高興看到如何用Java把它拉下來。你的回覆看起來很奇怪 - 在滾動文本區域滾動文本區域 - 我敢肯定,這是一個臭蟲... – blissapp 2010-05-28 23:17:02

+0

我沒有做任何事情有意地有兩個滾動測試區域......只是想到了這樣..我我也對此感到驚訝.. :) – 2010-05-31 01:16:03