根据值对C#中具有不同标签的xelement进行排序
Sorting xelement with different tags in C# based on value
我有下面的XML需要根据值sequence
标签进行排序,排序的XML放在Totals根节点,这在C#中可行吗.如果序列为空或重复,则将该标签留在原处。
<Totals sequence="001" label="Totals" tooltip="Totals">
<ReturnTotalGrossReceipts sequence="001" datatype="Money" label="Total Receipts" />
<ReturnTotalAdjusts sequence="002" datatype="Money" label="Total Adjustments" />
<ReturnTotalTaxableSales sequence="003" datatype="Money" label="Total Taxable Sales" />
<ReturnTotalTax sequence="005" datatype="Money" label="Total Amount of Tax" />
<ReturnTimelyPay sequence="004" datatype="Money" label="Total Pay" />
<ReturnTotalSalesTaxDue sequence="006" datatype="Money" label="Total Due" />
<ReturnInterest sequence="006" datatype="Money" label="Interest" />
</Totals>
下面的代码应该会为您提供一个排序列表,如果序列元素为空,则将元素留在原地。
var sXml = "<Totals sequence=\"001\" label=\"Totals\" tooltip=\"Totals\"><ReturnTotalGrossReceipts sequence=\"001\" datatype=\"Money\" label=\"Total Receipts\" /><ReturnTotalAdjusts sequence=\"002\" datatype=\"Money\" label=\"Total Adjustments\" /><ReturnTotalTaxableSales sequence=\"003\" datatype=\"Money\" label=\"Total Taxable Sales\" /><ReturnTotalTax sequence=\"005\" datatype=\"Money\" label=\"Total Amount of Tax\" /><ReturnTimelyPay sequence=\"004\" datatype=\"Money\" label=\"Total Pay\" /><ReturnTotalSalesTaxDue sequence=\"006\" datatype=\"Money\" label=\"Total Due\" /><ReturnInterest sequence=\"006\" datatype=\"Money\" label=\"Interest\" /></Totals>";
var xml = XElement.Parse(sXml);
xml
.Descendants()
.Select((x, i) => new { Index = i, Element = x })
.OrderBy(x => Convert.ToInt32(x.Element.Attribute("sequence")?.Value ?? x.Index.ToString()))
.Select(x => x.Element);
试试这个
using System.Xml.Linq;
namespace ConsoleApplication29
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument xdoc = XDocument.Load(FILENAME);
XElement total = xdoc.Descendants("Totals").First();
total.ReplaceNodes(total.Elements().OrderBy(x => (int)x.Attribute("sequence")));
}
}
}
我有下面的XML需要根据值sequence
标签进行排序,排序的XML放在Totals根节点,这在C#中可行吗.如果序列为空或重复,则将该标签留在原处。
<Totals sequence="001" label="Totals" tooltip="Totals">
<ReturnTotalGrossReceipts sequence="001" datatype="Money" label="Total Receipts" />
<ReturnTotalAdjusts sequence="002" datatype="Money" label="Total Adjustments" />
<ReturnTotalTaxableSales sequence="003" datatype="Money" label="Total Taxable Sales" />
<ReturnTotalTax sequence="005" datatype="Money" label="Total Amount of Tax" />
<ReturnTimelyPay sequence="004" datatype="Money" label="Total Pay" />
<ReturnTotalSalesTaxDue sequence="006" datatype="Money" label="Total Due" />
<ReturnInterest sequence="006" datatype="Money" label="Interest" />
</Totals>
下面的代码应该会为您提供一个排序列表,如果序列元素为空,则将元素留在原地。
var sXml = "<Totals sequence=\"001\" label=\"Totals\" tooltip=\"Totals\"><ReturnTotalGrossReceipts sequence=\"001\" datatype=\"Money\" label=\"Total Receipts\" /><ReturnTotalAdjusts sequence=\"002\" datatype=\"Money\" label=\"Total Adjustments\" /><ReturnTotalTaxableSales sequence=\"003\" datatype=\"Money\" label=\"Total Taxable Sales\" /><ReturnTotalTax sequence=\"005\" datatype=\"Money\" label=\"Total Amount of Tax\" /><ReturnTimelyPay sequence=\"004\" datatype=\"Money\" label=\"Total Pay\" /><ReturnTotalSalesTaxDue sequence=\"006\" datatype=\"Money\" label=\"Total Due\" /><ReturnInterest sequence=\"006\" datatype=\"Money\" label=\"Interest\" /></Totals>";
var xml = XElement.Parse(sXml);
xml
.Descendants()
.Select((x, i) => new { Index = i, Element = x })
.OrderBy(x => Convert.ToInt32(x.Element.Attribute("sequence")?.Value ?? x.Index.ToString()))
.Select(x => x.Element);
试试这个
using System.Xml.Linq;
namespace ConsoleApplication29
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument xdoc = XDocument.Load(FILENAME);
XElement total = xdoc.Descendants("Totals").First();
total.ReplaceNodes(total.Elements().OrderBy(x => (int)x.Attribute("sequence")));
}
}
}