2009-12-17 127 views
2

我需要通過標記名稱和屬性對XML進行排序。 是否有可能使用DOM?排序XML文件

我需要一個排序的XML文件不是HTML的結果。

例如:

<books> 
    <book id='1'> 
     <name value='N1'/> 
     <author value='A1'/> 
    </book> 
    <book id='3'> 
     <name value='N3'/> 
     <author value='A3'/> 
    </book> 
    <book id='2'> 
     <author value='A2'/> 
     <name value='N2'/> 
    </book> 
</books> 

我希望sortXML

<books> 
    <book id='1'> 
     <author value='A1'/> 
     <name value='N1'/>  
    </book> 
    <book id='2'> 
     <author value='A2'/> 
     <name value='N2'/> 
    </book> 
    <book id='3'> 
     <author value='A3'/> 
     <name value='N3'/>  
    </book> 
</books> 

XML被標籤名稱進行排序,然後通過ID

+2

請原諒我的無知,但爲什麼要對XML進行排序?依靠元素的順序在我對XML的理解上是不明智的。很高興被糾正,但:) – 2009-12-17 08:43:22

+1

@Tom Duckering:爲了顯示的目的,我猜? – Vinz 2009-12-17 08:57:23

回答

3

你( 'ID')後獲得可以編寫一個XSL,使用sort-element對數據進行排序,並將XML文檔轉換爲它,如果你的DOM實現支持XSL轉換。

或者,您可以將所有元素提取到數組並實現排序算法,例如, bubble sort,對數組的元素進行排序。

或者,如果您使用.Net DOM,則可以使用排序XPath查詢。 XPath不支持自行排序,但.Net實現提供了XPathExpression.AddSort method

+0

偉大的迴應(總體).. +1 – 2009-12-28 08:18:40

1

用java:

  • 在所有的元素下的「書」「書」創造的「元素」
  • 循環列表,並將其添加到列表中
  • 卸下所有的「書」從父 '圖書'
  • 排序列表使用自定義Comparator<Element>

    比較<元> { INT的compareTo(元一個,元件b) { /*比較A /作者和B /作者*/ 值}在列表 }

  • 遍歷所有元素,並插入回'圖書'

使用XSLT:

看到的xsl:for-each和xsl:sort

1

我想補充的XSL蘇由Vinz擁塞:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="books"> 
     <books> 
      <xsl:apply-templates select="book"> 
       <xsl:sort select="@id" data-type="number" order="ascending" /> 
      </xsl:apply-templates> 
     </books> 
    </xsl:template> 

    <xsl:template match="book"> 
     <book> 
      <xsl:attribute name="id"> 
       <xsl:value-of select="@id"/> 
      </xsl:attribute> 
      <xsl:apply-templates> 
       <xsl:sort select="local-name()" data-type="text" order="ascending" /> 
      </xsl:apply-templates> 
     </book> 
    </xsl:template> 

    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet>