2015-10-01 35 views
0

我想寫轉換XML文件給該程序的分類排序,按日期 的XML文件是這樣的:轉換XML文件的排序

<Root> 
     <Orders> 
    <Order> 
     <CustomerID>GREAL</CustomerID> 
     <EmployeeID>8</EmployeeID> 
     <OrderDate>1997-07-04T00:00:00</OrderDate> 
     <RequiredDate>1997-08-01T00:00:00</RequiredDate> 
     <ShipInfo ShippedDate="1997-07-14T00:00:00"> 
     <ShipVia>2</ShipVia> 
     <Freight>4.42</Freight> 
     <ShipName>Great Lakes Food Market</ShipName> 
     <ShipAddress>2732 Baker Blvd.</ShipAddress> 
     <ShipCity>Eugene</ShipCity> 
     <ShipRegion>OR</ShipRegion> 
     <ShipPostalCode>97403</ShipPostalCode> 
     <ShipCountry>USA</ShipCountry> 
     </ShipInfo> 
    </Order> 
    <Order> 
     <CustomerID>GREAL</CustomerID> 
     <EmployeeID>1</EmployeeID> 
     <OrderDate>1997-07-31T00:00:00</OrderDate> 
     <RequiredDate>1997-08-28T00:00:00</RequiredDate> 
     <ShipInfo ShippedDate="1997-08-05T00:00:00"> 
     <ShipVia>2</ShipVia> 
     <Freight>116.53</Freight> 
     <ShipName>Great Lakes Food Market</ShipName> 
     <ShipAddress>2732 Baker Blvd.</ShipAddress> 
     <ShipCity>Eugene</ShipCity> 
     <ShipRegion>OR</ShipRegion> 
     <ShipPostalCode>97403</ShipPostalCode> 
     <ShipCountry>USA</ShipCountry> 
     </ShipInfo> 
    </Order> 
    <Order> 
     <CustomerID>GREAL</CustomerID> 
     <EmployeeID>3</EmployeeID> 
     <OrderDate>1997-09-25T00:00:00</OrderDate> 
     <RequiredDate>1997-10-23T00:00:00</RequiredDate> 
     <ShipInfo ShippedDate="1997-09-30T00:00:00"> 
     <ShipVia>3</ShipVia> 
     <Freight>76.13</Freight> 
     <ShipName>Great Lakes Food Market</ShipName> 
     <ShipAddress>2732 Baker Blvd.</ShipAddress> 
     <ShipCity>Eugene</ShipCity> 
     <ShipRegion>OR</ShipRegion> 
     <ShipPostalCode>97403</ShipPostalCode> 
     <ShipCountry>USA</ShipCountry> 
     </ShipInfo> 
    </Order> 
    <Order> 
     <CustomerID>GREAL</CustomerID> 
     <EmployeeID>4</EmployeeID> 
     <OrderDate>1998-01-06T00:00:00</OrderDate> 
     <RequiredDate>1998-02-03T00:00:00</RequiredDate> 
     <ShipInfo ShippedDate="1998-02-04T00:00:00"> 
     <ShipVia>2</ShipVia> 
     <Freight>719.78</Freight> 
     <ShipName>Great Lakes Food Market</ShipName> 
     <ShipAddress>2732 Baker Blvd.</ShipAddress> 
     <ShipCity>Eugene</ShipCity> 
     <ShipRegion>OR</ShipRegion> 
     <ShipPostalCode>97403</ShipPostalCode> 
     <ShipCountry>USA</ShipCountry> 
     </ShipInfo> 
    </Order> 
    <Order> 
     <CustomerID>GREAL</CustomerID> 
     <EmployeeID>3</EmployeeID> 
     <OrderDate>1998-04-07T00:00:00</OrderDate> 
     <RequiredDate>1998-05-05T00:00:00</RequiredDate> 
     <ShipInfo ShippedDate="1998-04-15T00:00:00"> 
     <ShipVia>2</ShipVia> 
     <Freight>25.19</Freight> 
     <ShipName>Great Lakes Food Market</ShipName> 
     <ShipAddress>2732 Baker Blvd.</ShipAddress> 
     <ShipCity>Eugene</ShipCity> 
     <ShipRegion>OR</ShipRegion> 
     <ShipPostalCode>97403</ShipPostalCode> 
     <ShipCountry>USA</ShipCountry> 
     </ShipInfo> 
    </Order> 
    <Order> 
     <CustomerID>GREAL</CustomerID> 
     <EmployeeID>4</EmployeeID> 
     <OrderDate>1998-04-22T00:00:00</OrderDate> 
     <RequiredDate>1998-05-20T00:00:00</RequiredDate> 
     <ShipInfo> 
     <ShipVia>3</ShipVia> 
     <Freight>18.84</Freight> 
     <ShipName>Great Lakes Food Market</ShipName> 
     <ShipAddress>2732 Baker Blvd.</ShipAddress> 
     <ShipCity>Eugene</ShipCity> 
     <ShipRegion>OR</ShipRegion> 
     <ShipPostalCode>97403</ShipPostalCode> 
     <ShipCountry>USA</ShipCountry> 
     </ShipInfo> 
    </Order> 
</Orders> 
    </Root> 

我希望它進行排序通過OrderDate但我不知道該怎麼做。任何人都可以給我任何建議嗎?

+0

沒有直接的方法對文件數據進行排序。您可以閱讀該文件,創建XML對象(反序列化等),對該對象進行排序並在需要時寫回文件。 –

+0

是的,我想要那個。我該怎麼做? –

+0

你的目標是什麼?有一個xml文件,其中的條目按* OrderDate *排序或讀取和寫入xml文件的程序?如果您只是希望對該XML文件進行排序(但我不確定是否要對XML的主要用途進行排序),則可以使用XSL進行排序。你想編寫一個程序,我的第一種方法是創建一些代表ORDER,CUSTOMER等的對象,讀取文件並創建對象,將它們存儲在一個列表中,對列表進行排序並將列表作爲XML文件存放再次。 – mnille

回答

0
XDocument xDoc = XDocument.Parse(xmlDoc);//xmlDoc = your xml file or input stream 
IList<XElement> records = xDoc.Root.Elements("Order").OrderBy(x => x.Element("OrderDate").Value).ToList(); 

這是通過訂購日期

下令所有訂單記錄的列表。如果你想在一個文件中,使用「記錄」作爲數據源重新創建XML文件

+0

'x.Element(「OrderDate」)。Value'將是字符串,嘗試將其轉換爲'DateTime'。 –

+0

用.ToShortDateString()替換.Value也許? 對此沒有做太多的工作... –

+0

或追加:Value.ToShortDateString() –

0

我使用的LINQ XML。我認爲添加新的XML元素要比對原始文件進行排序要容易得多

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string input = 
       "<Root>" + 
        "<Orders>" + 
         "<Order>" + 
          "<CustomerID>GREAL</CustomerID>" + 
          "<EmployeeID>8</EmployeeID>" + 
          "<OrderDate>1997-07-04T00:00:00</OrderDate>" + 
          "<RequiredDate>1997-08-01T00:00:00</RequiredDate>" + 
          "<ShipInfo ShippedDate=\"1997-07-14T00:00:00\">" + 
          "<ShipVia>2</ShipVia>" + 
          "<Freight>4.42</Freight>" + 
          "<ShipName>Great Lakes Food Market</ShipName>" + 
          "<ShipAddress>2732 Baker Blvd.</ShipAddress>" + 
          "<ShipCity>Eugene</ShipCity>" + 
          "<ShipRegion>OR</ShipRegion>" + 
          "<ShipPostalCode>97403</ShipPostalCode>" + 
          "<ShipCountry>USA</ShipCountry>" + 
          "</ShipInfo>" + 
         "</Order>" + 
         "<Order>" + 
          "<CustomerID>GREAL</CustomerID>" + 
          "<EmployeeID>1</EmployeeID>" + 
          "<OrderDate>1997-07-31T00:00:00</OrderDate>" + 
          "<RequiredDate>1997-08-28T00:00:00</RequiredDate>" + 
          "<ShipInfo ShippedDate=\"1997-08-05T00:00:00\">" + 
          "<ShipVia>2</ShipVia>" + 
          "<Freight>116.53</Freight>" + 
          "<ShipName>Great Lakes Food Market</ShipName>" + 
          "<ShipAddress>2732 Baker Blvd.</ShipAddress>" + 
          "<ShipCity>Eugene</ShipCity>" + 
          "<ShipRegion>OR</ShipRegion>" + 
          "<ShipPostalCode>97403</ShipPostalCode>" + 
          "<ShipCountry>USA</ShipCountry>" + 
          "</ShipInfo>" + 
         "</Order>" + 
         "<Order>" + 
          "<CustomerID>GREAL</CustomerID>" + 
          "<EmployeeID>3</EmployeeID>" + 
          "<OrderDate>1997-09-25T00:00:00</OrderDate>" + 
          "<RequiredDate>1997-10-23T00:00:00</RequiredDate>" + 
          "<ShipInfo ShippedDate=\"1997-09-30T00:00:00\">" + 
          "<ShipVia>3</ShipVia>" + 
          "<Freight>76.13</Freight>" + 
          "<ShipName>Great Lakes Food Market</ShipName>" + 
          "<ShipAddress>2732 Baker Blvd.</ShipAddress>" + 
          "<ShipCity>Eugene</ShipCity>" + 
          "<ShipRegion>OR</ShipRegion>" + 
          "<ShipPostalCode>97403</ShipPostalCode>" + 
          "<ShipCountry>USA</ShipCountry>" + 
          "</ShipInfo>" + 
         "</Order>" + 
         "<Order>" + 
          "<CustomerID>GREAL</CustomerID>" + 
          "<EmployeeID>4</EmployeeID>" + 
          "<OrderDate>1998-01-06T00:00:00</OrderDate>" + 
          "<RequiredDate>1998-02-03T00:00:00</RequiredDate>" + 
          "<ShipInfo ShippedDate=\"1998-02-04T00:00:00\">" + 
          "<ShipVia>2</ShipVia>" + 
          "<Freight>719.78</Freight>" + 
          "<ShipName>Great Lakes Food Market</ShipName>" + 
          "<ShipAddress>2732 Baker Blvd.</ShipAddress>" + 
          "<ShipCity>Eugene</ShipCity>" + 
          "<ShipRegion>OR</ShipRegion>" + 
          "<ShipPostalCode>97403</ShipPostalCode>" + 
          "<ShipCountry>USA</ShipCountry>" + 
          "</ShipInfo>" + 
         "</Order>" + 
         "<Order>" + 
          "<CustomerID>GREAL</CustomerID>" + 
          "<EmployeeID>3</EmployeeID>" + 
          "<OrderDate>1998-04-07T00:00:00</OrderDate>" + 
          "<RequiredDate>1998-05-05T00:00:00</RequiredDate>" + 
          "<ShipInfo ShippedDate=\"1998-04-15T00:00:00\">" + 
          "<ShipVia>2</ShipVia>" + 
          "<Freight>25.19</Freight>" + 
          "<ShipName>Great Lakes Food Market</ShipName>" + 
          "<ShipAddress>2732 Baker Blvd.</ShipAddress>" + 
          "<ShipCity>Eugene</ShipCity>" + 
          "<ShipRegion>OR</ShipRegion>" + 
          "<ShipPostalCode>97403</ShipPostalCode>" + 
          "<ShipCountry>USA</ShipCountry>" + 
          "</ShipInfo>" + 
         "</Order>" + 
         "<Order>" + 
          "<CustomerID>GREAL</CustomerID>" + 
          "<EmployeeID>4</EmployeeID>" + 
          "<OrderDate>1998-04-22T00:00:00</OrderDate>" + 
          "<RequiredDate>1998-05-20T00:00:00</RequiredDate>" + 
          "<ShipInfo>" + 
          "<ShipVia>3</ShipVia>" + 
          "<Freight>18.84</Freight>" + 
          "<ShipName>Great Lakes Food Market</ShipName>" + 
          "<ShipAddress>2732 Baker Blvd.</ShipAddress>" + 
          "<ShipCity>Eugene</ShipCity>" + 
          "<ShipRegion>OR</ShipRegion>" + 
          "<ShipPostalCode>97403</ShipPostalCode>" + 
          "<ShipCountry>USA</ShipCountry>" + 
          "</ShipInfo>" + 
         "</Order>" + 
        "</Orders>" + 
       "</Root>"; 

      XDocument root = XDocument.Parse(input); 

      var sortedOrder = root.Descendants("Order").Select(x => new 
      { 
       order = x, 
       orderDate = (DateTime)x.Element("OrderDate") 
      }).OrderBy(y => y.orderDate).ToList(); 

      XElement sortedXml = new XElement("Root", new XElement("Orders")); 
      XElement orders = sortedXml.Descendants("Orders").FirstOrDefault(); 
      foreach (var ordered in sortedOrder) 
      { 
       orders.Add(ordered.order); 
      } 
     } 
    } 
} 
​