XML: Bestimmte Nodes suchen und sortieren

Loki2

Erfahrenes Mitglied
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... :(
 
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.
 
Hallo!

Ich würde das sortieren über XSLT machen:

XML:
<myRoot>
   <bla>
      <blub>9</blub>
   </bla>

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

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

Stylesheet:
XML:
<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>

Java:
/**
 * 
 */
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:
XML:
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
 
Zuletzt bearbeitet von einem Moderator:
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! :confused:
Und da mein XML File nur aus Knoten mit Attributen und ohne expliziten Content besteht, sieht das File danach recht leer aus. :(

Siehe hier:
HTML:
<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:
HTML:
<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!
 
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:

HTML:
<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
 
Zuletzt bearbeitet:
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!
 
So Leute!

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

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

So long!
 
Zurück