2016-12-01 17 views
0

以下のXMLを値sequenceタグに基づいてソートする必要があります。ソートのXMLは合計ルートノードに配置されます。これはC#で可能です。シーケンスが空であるか繰り返している場合は、そのタグをその場所に置きます。C#で異なるタグを持つxelementを値に基づいてソートする

<Totals sequence="001" label="Totals" tooltip="Totals"> 
    <ReturnTotalGrossReceipts sequence="001" datatype="Money" label="Total Receipts" /> 
    <ReturnTotalAdjusts sequence="002" datatype="Money" label="Total Adjustments" /> 
    <ReturnTotalTaxableSales sequence="003" datatype="Money" label="Total Taxable Sales" /> 
    <ReturnTotalTax sequence="005" datatype="Money" label="Total Amount of Tax" /> 
    <ReturnTimelyPay sequence="004" datatype="Money" label="Total Pay" /> 
    <ReturnTotalSalesTaxDue sequence="006" datatype="Money" label="Total Due" /> 
    <ReturnInterest sequence="006" datatype="Money" label="Interest" /> 
</Totals> 
+0

を試してみてください。はい、簡単にソートできます。シーケンス番号が同じ場合は、2つのフィールドをソートすることができます。 – jdweng

+0

利用可能なフィールドは1つだけです。シーケンスが空であるか、または繰り返すと、 – amity2

+0

はすべてのタグがルートタグ内で異なるため、ソートすることができます。合計、要素のorderbyは失敗しています – amity2

答えて

1

次のコードでは、ソートされたリストが提供され、シーケンス要素がnullの場合は要素がそのまま残ります。

var sXml = "<Totals sequence=\"001\" label=\"Totals\" tooltip=\"Totals\"><ReturnTotalGrossReceipts sequence=\"001\" datatype=\"Money\" label=\"Total Receipts\" /><ReturnTotalAdjusts sequence=\"002\" datatype=\"Money\" label=\"Total Adjustments\" /><ReturnTotalTaxableSales sequence=\"003\" datatype=\"Money\" label=\"Total Taxable Sales\" /><ReturnTotalTax sequence=\"005\" datatype=\"Money\" label=\"Total Amount of Tax\" /><ReturnTimelyPay sequence=\"004\" datatype=\"Money\" label=\"Total Pay\" /><ReturnTotalSalesTaxDue sequence=\"006\" datatype=\"Money\" label=\"Total Due\" /><ReturnInterest sequence=\"006\" datatype=\"Money\" label=\"Interest\" /></Totals>"; 
var xml = XElement.Parse(sXml); 
xml 
    .Descendants() 
    .Select((x, i) => new { Index = i, Element = x }) 
    .OrderBy(x => Convert.ToInt32(x.Element.Attribute("sequence")?.Value ?? x.Index.ToString())) 
    .Select(x => x.Element); 
1

あなたはソートして所定の位置に残すことができません。この

using System.Xml.Linq; 

namespace ConsoleApplication29 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument xdoc = XDocument.Load(FILENAME); 
      XElement total = xdoc.Descendants("Totals").First(); 


      total.ReplaceNodes(total.Elements().OrderBy(x => (int)x.Attribute("sequence"))); 
     } 

    } 

} 
関連する問題