2017-05-24 9 views
1

Ich versuche, das folgende XML nach Datum als Hauptkriterium zu sortieren und dann als zweites Kriterium zu berechnen.XML-Knoten nach mehreren Kriterien sortieren

Ich dachte, es ist ausreichend, zuerst nach Preis zu sortieren und dann nach Datum zu sortieren. Ich erwartete Buch bk108 am Ende zuerst aufgrund der neuesten mit dem höchsten Preis, aber stattdessen das erste Buch ist bkXXX, obwohl sein Preis niedriger als bk108 ist.

$xml = [xml]@' 
<?xml version="1.0"?> 
<catalog> 
    <book id="bk101"> 
     <author>Gambardella, Matthew</author> 
     <title>XML Developer's Guide</title> 
     <genre>Computer</genre> 
     <price>44.95</price> 
     <publish_date>2000-10-01</publish_date> 
     <description>An in-depth look at creating applications 
     with XML.</description> 
    </book> 
    <book id="bk102"> 
     <author>Ralls, Kim</author> 
     <title>Midnight Rain</title> 
     <genre>Fantasy</genre> 
     <price>5.95</price> 
     <publish_date>2000-12-16</publish_date> 
     <description>A former architect battles corporate zombies, 
     an evil sorceress, and her own childhood to become queen 
     of the world.</description> 
    </book> 
    <book id="bk103"> 
     <author>Corets, Eva</author> 
     <title>Maeve Ascendant</title> 
     <genre>Fantasy</genre> 
     <price>5.95</price> 
     <publish_date>2000-11-17</publish_date> 
     <description>After the collapse of a nanotechnology 
     society in England, the young survivors lay the 
     foundation for a new society.</description> 
    </book> 
    <book id="bk104"> 
     <author>Corets, Eva</author> 
     <title>Oberon's Legacy</title> 
     <genre>Fantasy</genre> 
     <price>5.95</price> 
     <publish_date>2001-03-10</publish_date> 
     <description>In post-apocalypse England, the mysterious 
     agent known only as Oberon helps to create a new life 
     for the inhabitants of London. Sequel to Maeve 
     Ascendant.</description> 
    </book> 
    <book id="bk105"> 
     <author>Corets, Eva</author> 
     <title>The Sundered Grail</title> 
     <genre>Fantasy</genre> 
     <price>5.95</price> 
     <publish_date>2001-09-10</publish_date> 
     <description>The two daughters of Maeve, half-sisters, 
     battle one another for control of England. Sequel to 
     Oberon's Legacy.</description> 
    </book> 
    <book id="bk106"> 
     <author>Randall, Cynthia</author> 
     <title>Lover Birds</title> 
     <genre>Romance</genre> 
     <price>1000</price> 
     <publish_date>2000-09-02</publish_date> 
     <description>When Carla meets Paul at an ornithology 
     conference, tempers fly as feathers get ruffled.</description> 
    </book> 
    <book id="bk107"> 
     <author>Thurman, Paula</author> 
     <title>Splish Splash</title> 
     <genre>Romance</genre> 
     <price>1000</price> 
     <publish_date>2000-10-02</publish_date> 
     <description>A deep sea diver finds true love twenty 
     thousand leagues beneath the sea.</description> 
    </book> 
    <book id="bk108"> 
     <author>Knorr, Stefan</author> 
     <title>Creepy Crawlies</title> 
     <genre>Horror</genre> 
     <price>999</price> 
     <publish_date>2001-12-06</publish_date> 
     <description>An anthology of horror stories about roaches, 
     centipedes, scorpions and other insects.</description> 
    </book> 
    <book id="bkXXX"> 
     <author>new auth</author> 
     <title>some title</title> 
     <genre>Horror</genre> 
     <price>998</price> 
     <publish_date>2001-12-06</publish_date> 
     <description>would go here</description> 
    </book> 
    <book id="bk113"> 
     <author>Knorr, Stefan</author> 
     <title>Creepy Crawlies</title> 
     <genre>Horror</genre> 
     <price>999</price> 
     <publish_date>2000-12-06</publish_date> 
     <description>An anthology of horror stories about roaches, 
     centipedes, scorpions and other insects.</description> 
    </book> 
    <book id="bk109"> 
     <author>Kress, Peter</author> 
     <title>Paradox Lost</title> 
     <genre>Science Fiction</genre> 
     <price>6.95</price> 
     <publish_date>2000-11-02</publish_date> 
     <description>After an inadvertant trip through a Heisenberg 
     Uncertainty Device, James Salway discovers the problems 
     of being quantum.</description> 
    </book> 
</catalog> 
'@ 
[System.Xml.XmlNode]$orig = $xml.catalog 
$orig.book | sort { [double] $_.price} | 
    foreach { [void]$xml.catalog.PrependChild($_) } 
$xml.catalog.book 

[System.Xml.XmlNode]$orig = $xml.catalog 
$orig.book | sort { [DateTime] $_.publish_date} | 
    foreach { [void]$xml.catalog.PrependChild($_) } 
$xml.catalog.book 

$xml.Save('c:\work\foo.xml') 

Das war mein Ausgangspunkt powershell xml sort nodes and replacechild

+0

Zur Zeit sind Sie durch einen Parameter zu einem Zeitpunkt, zu sortieren. Zuerst schauen Sie sich nur den Preis an und sortieren danach und danach schauen Sie sich das Datum an und sortieren nur nach Datum. Natürlich würden Sie am Ende eine Liste erhalten, die nur nach Datum sortiert ist. Außerdem ist Ihre Sortierung etwas ungewöhnlich, da [Sort-Object] (https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.utility/sort-object) keine akzeptiert Codeblock. – Seth

+0

'bk108' ist das neueste und das teuerste, nicht' bk105'. – wOxxOm

+0

Tippfehler, tut mir leid, dass ich es in der Beschreibung ändern werde – ivanz

Antwort

0

Ersetzen Sie Ihren Code nach [System.Xml.XmlNode]$orig = $xml.catalog mit diesem:

[xml]$sortedXml = @" 
    <catalog> 
     $(($orig.book | sort-object -Property {[double] $_.price},{[datetime]$_.publish_date} -descending).OuterXml) 
    </catalog> 
"@ 
+0

gibt es eine Möglichkeit zu vermeiden, schreiben Tags? Xml-Struktur meiner Datei ist ein bisschen kompliziert. Vielen Dank. Aber das könnte nur funktionieren, um zwischen Veröffentlichungsdatum und Preis zu wechseln – ivanz

Verwandte Themen