2010-05-26 13 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> 

나는 관계없이 날짜가 노드 1 또는 노드 2에서인지, 날짜 (예를 들어 오름차순 순서)에 따라 XML를 정렬하고 싶습니다. 실제로 Java 코드에서 두 개의 개별 목록이 있습니다. 하나는 Node1 개체이고 다른 하나는 Node2 개체입니다. 필자는 java 내부의 모든 순서로 목록을 정렬 할 수 있습니다. 하지만 XML에 적용되는 노드와 관계없이 날짜를 정렬해야합니다. Java에서이 방법으로 정렬하는 가장 좋은 방법은 무엇입니까?

Actaully Java 객체를 XML로 정렬하는 데 Castor를 사용하고 있습니다. 이것이 Castor를 사용하여 수행 할 수 있다는 것을 알고 있다면 그것은 훌륭합니다!

+0

감사합니다! 저스틴 .. –

+0

XML은 "의미"가 있기 때문에 오름차순으로 데이터를 정렬하는 것이 유용 할 "의미"가 아닙니다. ... – blissapp

+4

@blissapp - 주문은 XML에 기본이며, 추상 모델은 시퀀스입니다. . xpath 2.0/xquery의 기초. 어쩌면 관계형 데이터를 생각하고 있을까요? – mdma

답변

2
나는 XSLT를 사용하십시오

, 그것은 당신이 원하시면 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> 
+0

감사합니다 .... ........ –

+0

같은 케이스가 있습니다. 그러나 날짜 형식이 다릅니다 (예 : 2015-12-27T16 : 44 : 07). 그럴 경우 어떻게 할 수 있습니까? –

0

같은 정렬 날짜 형식을 가지고 당신이 라운드 작동해야합니다 날짜 정렬과 probs, 당신이 제어 할 수있는 경우 간단한 방법이있다 정렬 결과를 하나의 목록으로 정렬하고 날짜별로 정렬하면 모든 노드를 단일 배열 목록에 넣어야합니다. 두 가지 유형 (node1 & node2)이 공통 기본 클래스를 확장하는 경우 Java의 Generics for you 목록을 사용할 수 있습니다.

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

두 노드 유형이 공통 클래스에서 상속되지 않으면 단순히 객체 목록을 사용할 수 있습니다.

이제 자신 만의 Comparator를 작성해야합니다. 다음은 노드 유형에 날짜 필드를 보유하는 공통 수퍼 클래스가있는 경우 사용할 수있는 예제입니다.

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

사용자 지정 비교기와 모든 노드가있는 배열이 완성되었으므로 목록을 정렬하는 것은 단일 코드 줄입니다. 이 동작의에 당신이 어떤 추가 정보를 원하시면

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

위의 방법에 대한 javadoc의

here를 찾을 수 있습니다.

위의 방법을 사용하면 모든 유형의 비교 함수를 작성하여 정렬 동작을 변경하는 방법을 쉽게 알 수 있습니다. 당신이 원하는만큼의 커스텀 Comparator 클래스를 써서 런타임에 그것들을 바꿀 수 있습니다. 희망이 도움이! :)

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> 

이며 자바 코드는

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

멋진 방법입니다. 자바로 풀다. 귀하의 답변은 여기 아주 이상하게 보입니다 - 스크롤하는 텍스트 영역 내에서 스크롤하는 텍스트 영역 - 나는 SO 버그라고 확신합니다 ... – blissapp

+0

2 개의 스크롤링 영역을 의도적으로하지 않았습니다. 이처럼 나왔습니다. 또한 이걸로 놀랍다 .. :) –