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

вы пробовали что-нибудь ? - Показать нас –

+0

XElement root = XElement.Load ("C: \\ xmlsort \\ test.xml"); XElement [] sortedTables = root.Elements ("invoices"). OrderBy (t => (datetime) t.Element ("invoice/InvcDate")). ToArray(); root.ReplaceAll (отсортированные таблицы); root.Save ("C: \\ xmlsort \\ test.xml"); – MaltaBd

ответ

1

прочитаю вам XML в a 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()); 
} 

EDIT Ответ на свой вопрос в комментариях.

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

+0

XElement root = XElement.Load ("C: \\ xmlsort \\ test.xml"); var invoices = from p in root.Descendants («invoice») orderby DateTime.ParseExact (p.Element («header»). Элемент («InvcDate»). Значение «yyyy/MM/dd-hhmmss», CultureInfo .InvariantCulture) Выбрать p; XElement [] sortedTables = invoices.ToArray(); root.ReplaceAll (отсортированные таблицы); root.Save ("C: \\ xmlsort \\ output.xml"); – MaltaBd

+0

@PetSerAl Вы правы. – komaflash

Смежные вопросы