Question

J'ai un fichier XML similaire ci-dessous, qui doit être triés en utilisant le champ de date.

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

Je voudrais trier le XML en fonction de la date (par exemple l'ordre croissant), indépendamment du fait que la date est sous Noeud1 ou Node2. En fait, dans le code Java j'ai deux listes séparées, l'une avec des objets Node1 et d'autres objets avec Node2. Je peux trier la liste dans l'ordre séparément à l'intérieur java. Mais je dois avoir les dates triées indépendamment des noeuds, il apparaît sur le XML. Quelle est la meilleure approche pour trier cette façon en Java?

En fait, je me sers Castor pour marshaling les objets Java XML. Si vous savez ce qui peut être fait avec Castor, qui sera génial!

Était-ce utile?

La solution

J'utilise XSLT, il a probs avec des dates de tri que vous aurez besoin de tour de travail, plus simple si vous pouvez le contrôler est d'avoir le format de date triables comme yyyymmdd

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

Autres conseils

Si vous souhaitez le résultat de la sorte à une liste unique, triés par date vous devez mettre tous les nœuds en une seule liste de tableau. Si les deux types (node1 et node2) étendre une classe de base commune, vous pouvez utiliser les Generics de Java pour vous la liste.

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

Si les deux types de nœuds ne pas hériter d'une classe commune, vous pouvez simplement utiliser une liste d'objets.

Maintenant, vous devrez écrire votre propre Comparator. voici un exemple de celui que vous pouvez utiliser si les types de nœuds n'ont une classe super commune qui détient le champ Date.

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

Maintenant que vous avez votre comparateur personnalisé et votre tableau avec tous vos nœuds, il est une seule ligne de code Java pour trier la liste.

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

Le javadoc pour la méthode ci-dessus peut être trouvé ici si vous désirez des informations complémentaires sur le comportement de lui.

En utilisant la méthode ci-dessus, il est facile de voir comment vous pouvez écrire tout type de fonction de comparaison pour modifier le comportement de votre genre. Vous pouvez aussi écrire autant de classes de comparaison personnalisée que vous le voudrez afin que vous puissiez les passer à l'exécution. J'espère que cela t'aides! :)

je XSLT et xalan.

Le XSL est comme ci-dessous .. La date est du format mm / jj / aaaa

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

et le code java est

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 *************");
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top