# XML: Bestimmte Nodes suchen und sortieren



## Loki2 (2. November 2006)

Hallo

Ich habe  ein XML File:

<myRoot>
  <bla>
    <blub>9</blub>
  </bla>
  <bla>
    <blub>8</blub>
   </bla>
  <bla>
     <blub>10</blub>
   </bla>
</myRoot>

Ich muss jetzt zu erst das "bla" mit dem höchsten "blub" finden. Wie kann ich das bewerkstelligen?
Sobald ich das habe muss ich die Reihenfolge ändern aber ich denke das ist dann erstmal kein Problem mehr wenn ich weiss bei welchem "bla" ich anfangen muss.

Könnt ihr mir weiterhelfen? Das wäre wirklich großartig da ich ziemlich ratolos bin im Moment...


----------



## darksmilie (2. November 2006)

Vielleicht hilft dir das weiter:
Reading XML


----------



## zeja (2. November 2006)

Du könntest deine XML-Datei mittels Castor in Java Beans einlesen, diese dann als Collections sortieren lassen und mit Castor wieder zurückschreiben.

Ich weiss nicht mehr genau, aber eventuell kann auch XPath das Element mit der höchsten Nummer finden.


----------



## Thomas Darimont (2. November 2006)

Hallo!

Ich würde das sortieren über XSLT machen:


```
<myRoot>
   <bla>
      <blub>9</blub>
   </bla>

   <bla>
      <blub>8</blub>
   </bla>

   <bla>
      <blub>10</blub>
   </bla>
</myRoot>
```

Stylesheet:

```
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     version="1.0">

  <xsl:template match="myRoot">
    <xsl:copy>
      <xsl:apply-templates>
         <xsl:sort data-type="number" select="blub/text()"/>
         </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="*">
    <xsl:copy>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>
```


```
/**
 * 
 */
package de.tutorials;

import java.io.File;

import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

/**
 * @author Thomas.Darimont
 * 
 */
public class XslTransformator {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        StreamSource streamSource = new StreamSource(new File(
                "c:/xmlSort.xml"));
        TransformerFactory.newInstance().newTransformer(
                new StreamSource(new File("c:/xmlSort.xsl"))).transform(
                streamSource,
                new StreamResult(new File("c:/xmlSortResult.xml")));
    }
}
```

Ausgabe:

```
C:\>type xmlSortResult.xml
<?xml version="1.0" encoding="UTF-8"?><myRoot>





<bla>
      <blub>8</blub>
   </bla><bla>
      <blub>9</blub>
   </bla><bla>
      <blub>10</blub>
   </bla></myRoot>
C:\>
```

Gruß Tom


----------



## Fenrizwolf (21. August 2008)

*Hallo!*

Ich hab auch ein Problem mit der Sortierung einer XML Datei! 

Das was Thomas hier gepostet hat funktioniert zwar wunderbar, aber es bleibt ein riesiges Problem, es werden *ALLE* Attribute der Knoten gelöscht!  
Und da mein XML File nur aus Knoten mit Attributen und ohne expliziten Content besteht, sieht das File danach recht leer aus. 

Siehe hier: 
	
	
	



```
<stations>
    <globals>
        <plugins>
            <plugin/>
            <plugin/>
            <plugin/>
        </plugins>
    </globals>
    <station>     
        <plugins>
            <plugin>
                <parameter/>
                <parameter/>
                <parameter/>
                <parameter/>
                <parameter/>
                <parameter/>
                <parameter/>
                <parameter/>
            </plugin>
        </plugins>
        <regHandler>
            <pluginRef/>
        </regHandler>
        <statistics>
            <parameter/>
        </statistics>
        <boxhash>
            <parameter/>
        </boxhash>
.....
```
Ausgegangen wird von folgendem File:

```
<stations>
    <globals>
        <plugins>
            <plugin name="PluginStationAnn" class="peem.steuer.v2.plugin.imp.PluginStationAnn"/>
            <plugin name="PluginStationResp" class="peem.steuer.v2.plugin.imp.PluginStationResp"/>
            <plugin name="PluginCloseStation" class="peem.steuer.v2.plugin.imp.PluginCloseStation"/>
        </plugins>
    </globals>
    <station name="AV1">     
        <plugins>
            <plugin name="PluginAvonPlAV" class="peem.steuer.v2.plugin.imp.PluginAvonPlAV">
                <parameter name="AvWrapper" value="AV1Wrapper"/>
                <parameter name="MaxImLager" value="900000"/>
                <parameter name="DefaultBoxWait" value="10000"/>
                <parameter name="ValidOrderStates" value="0,100,900"/>
                <parameter name="OrderQueueType" value="default"/>
                <parameter name="AnnounceStation" value="LJ1,LJ2"/>
                <parameter name="EnteEndKontrolle" value="90"/>
                <parameter name="StationEndkontrolle" value="SK1,SK2"/>
            </plugin>
        </plugins>
        <regHandler>
            <pluginRef name="PluginAvonPlAV"/>
        </regHandler>
        <statistics name="DefaultStatisticTracker" className="peem.steuer.v2.plugin.imp.DefaultStatisticsTracker">
            <parameter name="NodeName" value="AV1"/>
        </statistics>
        <boxhash name="DefaultBoxHash" className="peem.steuer.v2.plugin.imp.PluginDefaultBoxHash">
            <parameter name="UseBoxHash" value="0"/>
        </boxhash>
        <targetConf>
            <target name="TER01" default="y" prio="1">
                <regHandler/>
                <respHandler>
                    <pluginRef name="PluginAvonPlAV"/>
                </respHandler>
                <ifCondition names="">
                    <plugins/>
                </ifCondition>
                <announce names="KAuf1,KAuf2"/>
            </target>
        </targetConf>
    </station>
    <station name="AV2">
...
```
Kann mir irgendjemand sagen wie ich ein XML File anhand eines Attributes eines Elementes sortieren kann und im neu erstellten File auch wieder alle Attribute mit drin sind?

Schon mal danke im voraus.

So long!


----------



## Fenrizwolf (21. August 2008)

Hallo! 

Ich weiß jetzt warum das nicht funktioniert hat, mittels <xsl:copy> wird nur der aktuelle Knoten OHNE dessen Attribute und dessen Childs kopiert. 

Ich habe dies nun wie folgt gelöst:


```
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    
    <xsl:output method="xml" version="1.0" indent="yes" />
    
    <xsl:template match="/"> 
        <xsl:apply-templates/> 
    </xsl:template> 
    
    <xsl:template match="*"> 
        <xsl:copy> 
            <xsl:copy-of select="@*"/> 
            <xsl:apply-templates>
                <!-- Sort by name -->
                <xsl:sort select="@name"/>
            </xsl:apply-templates> 
        </xsl:copy> 
    </xsl:template> 
    
    <!-- Copy all of the values of each tag. -->
    <xsl:template match="text()|comment()|processing-instruction()"> 
        <xsl:copy/> 
    </xsl:template>
    
</xsl:stylesheet>
```

Der Aufruf aus Java bleibt gleich!  

So long!

edit: Bevor ich es vergesse, die Idee zu dieser Variante hatte ich von http://www.macosxhints.com/dlfiles/xslt_safari_code.txt


----------



## Fenrizwolf (22. August 2008)

Hallo!

Jetzt hab ich schon mein nächstes Problem,...

Einige meiner XML Elemente verfügen nicht über das Attribute 'name', und somit werden diese auch nicht sortiert.

Sowiet ich das bis jetzt rausgefunden habe, kann ich einfach mehrere Sortierkriterien untereinanden angeben und diese werden dann nacheinander bearbeitet.

Aber leider hab ich bis jetzt nicht rausfinden können wie ich die Sortierung nach dem Tag - Namen machen kann. 

Bin für jeden Tipp dankbar! 


so long!


----------



## Fenrizwolf (25. August 2008)

So Leute!

Hab nun auch für dieses Problem eine Lösung gefunden.


```
<xsl:apply-templates>
                <!-- Sort by TAGname -->
                <xsl:sort select="name()"/>
                <!-- Sort by name -->
                <xsl:sort select="@name"/>
            </xsl:apply-templates>
```

So long!


----------

