2015-02-06 54 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