2010-05-26 2 views
6

Hallo Ich habe ein XML ähnlich wie unten, das mit dem Datumsfeld sortiert werden musste.Sortieren eines XML in Java

<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> 

würde Ich mag die XML sortieren basierend auf dem Datum (zB asc Reihenfolge), und zwar unabhängig davon, ob das Datum unter Node1 oder Knoten2 ist. Tatsächlich habe ich im Java-Code zwei getrennte Listen, eine mit Node1-Objekten und eine andere mit Node2-Objekten. Ich kann die Liste in beliebiger Reihenfolge innerhalb von Java sortieren. Aber ich muss die Daten unabhängig von den Knoten sortieren lassen, die im XML-Code enthalten sind. Was ist der beste Weg, um so in Java zu sortieren?

Actaully Ich verwende Castor zum Marshalling der Java-Objekte zu XML. Wenn Sie wissen, dass dies mit Castor gemacht werden kann, wird das großartig!

+0

Dank! Justin .. –

+0

XML ist "gemeint", um eine Menge zu sein, so das Sortieren Ihrer Daten in aufsteigender Reihenfolge ist nicht "gemeint", um nützlich zu sein ... – blissapp

+4

@blissapp - Reihenfolge ist grundlegend für XML, das abstrakte Modell ist eine Sequenz . die Basis von xpath 2.0/xquery. Vielleicht denken Sie an relationale Daten? – mdma

Antwort

2

ich XSLT verwenden würde, hat es probs mit Terminen Sortierung, die Sie rund, einfachste Weg zur Arbeit benötigen, wenn Sie es ist sortierbar Datumsformat wie yyyymmdd würden Sie

<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

Danke .... ........ –

+0

Ich habe den gleichen Fall - aber das Datumsformat ist anders - wie 2015-12-27T16: 44: 07, also wie in diesem Fall –

0

Wenn haben, steuern Wie das Ergebnis der Sortierung eine einzige Liste sein soll, sortiert nach Datum, dann müssen Sie alle Knoten in eine einzige Liste von Arrays setzen. Wenn die beiden Typen (node1 & node2) eine gemeinsame Basisklasse erweitern, können Sie die Java-Liste Generics for you verwenden.

Wenn die beiden Knotentypen nicht von einer gemeinsamen Klasse erben, können Sie einfach eine Liste von Objekten verwenden.

Jetzt müssen Sie Ihren eigenen Comparator schreiben. Hier ist ein Beispiel für eine, die Sie verwenden könnten, wenn die Knotentypen eine gemeinsame Superklasse haben, die das Datumsfeld enthält.

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

Nun, da Sie mit all Ihren Knoten Ihren benutzerdefinierten Komparator und Ihr Array haben, ist es eine einzige Zeile Java-Code die Liste zu sortieren.

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

Die javadoc für das obige Verfahren kann here gefunden werden, wenn Sie weitere Informationen möchten Sie darauf Verhalten ist.

Mit der obigen Methode ist es einfach zu sehen, wie Sie jede Art von Vergleichsfunktion schreiben können, um das Verhalten Ihrer Sorte zu ändern. Sie könnten auch so viele benutzerdefinierte Vergleichsklassen schreiben, wie Sie möchten, damit Sie sie zur Laufzeit wechseln können. Hoffe das hilft! :)

0

Ich verwendete XSLT und XALAN.

Die XSL ist wie folgt ..Datum ist im Format mm/tt/

<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> 

und der Java-Code ist

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

getan werden kann Cool, es ist gut zu sehen, wie ziehe es in Java ab. Ihre Antwort sieht hier ziemlich merkwürdig aus - Scrollen von Textbereichen in scrollenden Textbereichen - ich bin mir sicher, dass das ein SO-Bug ist ... – blissapp

+0

Ich habe absichtlich nichts getan, um zwei Scroll-Testbereiche zu haben bin auch damit überrascht .. :) –