簡體   English   中英

使用Linq對XML進行復雜排序

[英]Complex sorting of XML using Linq

我試圖為我的問題找到解決方案,但我在這方面的知識(Linq,XML)相當有限。 :('我發現了一個類似的結構 ,但我需要一個更復雜的排序方式。

考慮以下XML文檔:

<Envelope>
    <Body>
        <Table>
            <Trans>
                <B>1</B>
                <A>3</A>
                <C>5</C>
            </Trans>
            <Trans>
                <D>1</D>
                <A>6</A>
                <C>3</C>
            </Trans>
            <Trans>
                <A>1</A>
                <C>3</C>
                <B>5</B>
            </Trans>
        </Table>
    </Body>
<Envelope>

有什么方法可以使用C#/ Linq對<Trans>中的元素進行排序,還是我必須拆分所有<Trans>元素並逐個排序?

更新我有一個文件,這是我要完成的。 ;)

<Envelope>
    <Body>
       <Table>
           <Trans>
               <A>3</A>
               <B>1</B>
               <C>5</C>
           </Trans>
           <Trans>
               <A>6</A>
               <C>3</C>
               <D>1</D>
           </Trans>
           <Trans>
               <A>1</A>
               <B>5</B>
               <C>3</C>
           </Trans>
       </Table>
   </Body>
<Envelope>

這實際上取決於你想要做什么(按順序處理它們,或重新排序XML?)以及你究竟是什么意思“排序”(按標簽名稱排序?按值排序?)。

如果您只是想按順序處理它們,這就是如何按值( <A>6</A> <D>1</D><A>6</A>之前)對每個<Trans>內的所有元素進行排序:

XDocument doc = /* load up your XML */

var sorted = from trans in doc.Descendants("Trans")
             select trans.Children().OrderBy(c => int.Parse(c.Value)).ToArray();

或者,這里是如何按標簽名稱( <A>6</A> <D>1</D>之前的<A>6</A>訂購:

var sorted = from trans in doc.Descendants("Trans")
             select trans.Children().OrderBy(c => c.Name.LocalName).ToArray();

有了上面的內容, sorted將是一個可枚舉的數組集合。 集合中的每個數組代表一個<Trans> ,每個這樣的數組按順序保存<Trans>的子<Trans>

XDocument xDoc = XDocument.Load(....);
foreach(var trans in xDoc.Descendants("Trans"))
{
    trans.ReplaceAll( trans.Elements().OrderBy(x=>x.Name.LocalName));
}

string newXml = xDoc.ToString();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM