按元素值排序文件
Sort file by Element value
我有以下 xml 文件。(示例).. 我需要按属性 'InvcDate' 对 'invoice' 节点进行排序。这在 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");
在 XElement 中阅读您 XML:
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");
Select所有父节点:
var baseElement = doc.XPathSelectElement ("/Server/Params/Sales/invoices");
对内部节点进行排序:
var sortedElements = baseElement.Elements ()
.OrderBy (e => (DateTime)e.XPathSelectElement("header/InvoiceNum"))
.ToList ();
将当前内容替换为排序内容:
baseElement.ReplaceAll (sortedElements);
doc.Save ("out.xml");
我有以下 xml 文件。(示例).. 我需要按属性 'InvcDate' 对 'invoice' 节点进行排序。这在 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");
在 XElement 中阅读您 XML:
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");
Select所有父节点:
var baseElement = doc.XPathSelectElement ("/Server/Params/Sales/invoices");
对内部节点进行排序:
var sortedElements = baseElement.Elements ()
.OrderBy (e => (DateTime)e.XPathSelectElement("header/InvoiceNum"))
.ToList ();
将当前内容替换为排序内容:
baseElement.ReplaceAll (sortedElements);
doc.Save ("out.xml");