2015-02-06 61 views
0

我有以下xml文件(示例)..我需要通過屬性'InvcDate'對'發票'節點進行排序。 Linq甚至有可能嗎?任何幫助將非常感激。按元素值排序文件

我一直在嘗試一段時間,但是我對xml沒有太多經驗,而且我也是編程的新手,所以我會非常感謝任何幫助。

<?xml version="1.0" encoding="utf-8"?> 
<Server> 
    <Name>AlignServer</Name> 
    <Params> 
<marketNo>MT</marketNo> 
    <dateFrom>2015-01-06</dateFrom> 
    <dateTo>2015-01-09</dateTo> 
    <Sales> 
     <invoices> 
     <invoice> 
      <header> 
      <InvoiceNum>22947</InvoiceNum> 
      <InvcDate>2015/01/07-110104</InvcDate> 
      </header> 
      <item> 
      <SKU>6595456987453</SKU> 
      <Qty>-1</Qty> 
      </item> 
     </invoice> 
     <invoice> 
      <header> 
      <InvoiceNum>23056</InvoiceNum> 
      <InvcDate>2015/01/08-020627</InvcDate> 
      </header> 
      <item> 
      <SKU>9845256242255</SKU> 
      <Qty>-1</Qty> 
      </item> 
     </invoice> 
     <invoice> 
      <header> 
      <InvoiceNum>22899</InvoiceNum> 
      <InvcDate>2015/01/06-094505</InvcDate> 
      </header> 
      <item> 
      <SKU>5454256565452</SKU> 
      <Qty>-1</Qty> 
      </item> 
      <item> 
      <SKU>11111165454130</SKU> 
      <Qty>4</Qty> 
      </item> 
     </invoice> 
     </invoices> 
    </Sales> 
    </Params> 
</Server> 

我已經試過

XElement root = XElement.Load("C:\\xmlsort\\test.xml"); 
XElement[] sortedTables = root.Elements("invoices").OrderBy(t => (Datetime)t.Element("invdate")).ToArray(); 
root.ReplaceAll(sortedTables); 
root.Save("C:\\xmlsort\\test.xml"); 

我迄今所做的 - 從@ ec8or與建議,並似乎工作,但仍然開放的建議:

XElement root = XElement.Load("C:\\xmlsort\\test.xml"); 
var invoices = from p in root.Descendants("invoice") 
         orderby DateTime.ParseExact(p.Element("header").Element("InvcDate").Value, "yyyy/MM/dd-hhmmss", CultureInfo.InvariantCulture) 
select p; 
XElement[] sortedTables = invoices.ToArray(); 

root.ReplaceAll(sortedTables); 
root.Save("C:\\xmlsort\\output.xml"); 
+1

你嘗試過什麼? - 告訴我們 – 2015-02-06 20:37:33

+0

XElement root = XElement.Load(「C:\\ xmlsort \\ test.xml」); XElement [] sortedTables = root.Elements(「invoices」)。OrderBy(t =>(datetime)t.Element(「invoice/InvcDate」))。ToArray(); root.ReplaceAll(sortedTables); root.Save(「C:\\ xmlsort \\ test.xml」); – MaltaBd 2015-02-07 01:26:55

回答

1

閱讀你的XML一個XElement:

XElement element = XElement.Load("doc.xml"); 

查詢你XML數據:

var invoices = from p in element.Descendants ("invoice") 
       orderby DateTime.ParseExact(p.Element("header").Element("InvcDate").Value, "yyyy/MM/dd-hhmmss", CultureInfo.InvariantCulture) 
       select p; 

它打印到控制檯:

foreach (var invoice in invoices) { 
    Console.WriteLine (invoice.ToString()); 
} 

編輯 答案在評論你的問題。

XDocument doc = XDocument.Load ("data.xml"); 

選擇所有父節點:

var baseElement = doc.XPathSelectElement ("/Server/Params/Sales/invoices"); 

排序的內部節點:

var sortedElements = baseElement.Elements() 
    .OrderBy (e => (DateTime)e.XPathSelectElement("header/InvoiceNum")) 
    .ToList(); 

取代目前的內容與sortet內容:

baseElement.ReplaceAll (sortedElements); 
doc.Save ("out.xml"); 
+1

爲什麼不使用'XElement.Load(「doc.xml」)'而不是'XElement.Parse(File.ReadAllText(「doc.xml」))'? – PetSerAl 2015-02-07 02:05:14

+0

XElement root = XElement.Load(「C:\\ xmlsort \\ test.xml」); var invoices = from root.Descendants(「invoice」) orderby DateTime.ParseExact(p.Element(「header」)。Element(「InvcDate」)。Value,「yyyy/MM/dd-hhmmss」,CultureInfo .InvariantCulture) select p; XElement [] sortedTables = invoices.ToArray(); root.ReplaceAll(sortedTables); root.Save(「C:\\ xmlsort \\ output.xml」); – MaltaBd 2015-02-07 02:22:34

+0

@PetSerAl你說得對。 – komaflash 2015-02-08 11:31:49