Вопрос

У меня есть 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>

Я хотел бы отсортировать XML на основе даты (скажем, порядок по возрастанию), независимо от того, находится ли дата на Node1 или Node2. На самом деле, в Java Code у меня есть два отдельных списка, один с объектами Node1 и другие с объектами Node2. Я могу отсортировать список в любом порядке отдельно внутри Java. Но мне нужно, чтобы даты сортировались независимо от узлов, которые он появляется на XML. Какой лучший подход к этому пути в Java?

На самом деле я использую Castor для маршалинга объектов Java к XML. Если вы знаете, это можно сделать с Castor, это будет здорово!

Это было полезно?

Решение

Я бы использовал XSLT, у него есть проблемы со сортировочными датами, которые вам нужно будет работать, простейший способ, если вы сможете контролировать, - это иметь возможность иметь оттенциальный формат даты, такой как yyymmdd

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

Другие советы

Я также думаю, что сортировка XSL будет лучше и быстро.

Проверьте следующие ссылки,

http://www.codeproject.com/kb/xml/sorting_dates_in_xsl.aspx.

http://www.xml.com/pub/a/2002/07/03/transform.html?page=2.

http://forums.devx.com/showthread.php?t=4063.

Благодарю.

Если вы хотите, чтобы результат своего рода был один список, отсортирован по дате, вы должны поместить все узлы в один список массива. Если два типа (Node1 & Node2) расширяют общий базовый класс, вы можете использовать Generics Java для вашего списка.

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

Если два типа узлов не наследуют от общего класса, вы можете просто использовать список объектов.

Теперь вам придется написать свой собственный компаратор. Вот пример того, что вы можете использовать, если типы узлов имеют общий супер класс, который содержит поле даты.

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 для вышеуказанного способа можно найти здесь Если вы хотите получить дополнительную информацию о ней поведение.

Используя вышеуказанный метод, легко посмотреть, как вы можете написать любое типу функции сравнения для изменения поведения вашего вида. Вы также можете написать как можно больше пользовательских классов компаратора, так что вы можете переключить их во время выполнения. Надеюсь это поможет! :)

Я использовал 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 *************");
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top