2014-10-01 85 views
1

我是C#新手,有希望有人可以幫助我的問題?XML排序以保留根數據

我有一個非常小的代碼片段來排序一個大的XML文件。

using System; 
using System.Linq; 
using System.Xml.Linq; 

public class XMLsort 
{ 
public static void Sort(string netMyFile, string netOutFile) 
{ 
    XElement root = XElement.Load(netMyFile); 
    var orderedtabs = root.Elements("aidocument") 
     .OrderBy(xtab => (string)xtab.Element("aidocumentheader").Element("accountno")) 
     .ToArray(); 
    root.RemoveAll(); 
    foreach (XElement tab in orderedtabs) 
     root.Add(tab); 
    root.Save(netOutFile); 
} 
} 

這工作得很好,但它是刪除一些根標籤,我想知道如何將它們保留在排序的輸出?

原始XML是:

<?xml version="1.0" encoding="windows-1252" ?> 
<aitransmission xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance xsi:noNamespaceSchemaLocation="C:\Myschema\mysampleschema.xml"> 
<transmissionid>20120730DOCS</transmissionid> 
<transmissiontime>23:02:19</transmissiontime> 
<transmissiondate>2012-27-07</transmissiondate> 
<transmissionsource>fromprd</transmissionsource> 
<transmissioncount>71</transmissioncount> 
    <aidocument documenttype="adv"> 
    [data] 
    </aidocument> 
    <aidocument documenttype="adv"> 
    [data] 
    </aidocument> 
    <aidocument documenttype="adv"> 
    [data] 
    </aidocument> 
</aitransmission> 

返回的XML是:

<?xml version="1.0" encoding="utf-8"?> 
<aitransmission> 
    <aidocument documenttype="adv"> 
    [sorted data] 
    </aidocument> 
    <aidocument documenttype="adv"> 
    [sorted data] 
    </aidocument> 
    <aidocument documenttype="adv"> 
    [sorted data] 
    </aidocument> 

所以 '傳輸*' 標記被剝離。

有人可以提供一些援助嗎?

回答

1

當您撥打root.RemoveAll();時,所有元素都將被刪除。您實際上只需要移除「重新排序」的元素。重寫代碼,以便首先刪除節點,然後重新插入它。

代替

root.RemoveAll(); 
foreach (XElement tab in orderedtabs) 
    root.Add(tab); 

使用

foreach (XElement tab in orderedtabs) 
{ 
    tab.Remove(); 
    root.Add(tab); 
} 

Remove()方法不需要元件的特定位置,並且它也不會從內存中刪除的要素;它只是從父級元素中彈出元素。