XML排序选项C#.Net
本文关键字:Net 选项 排序 XML | 更新日期: 2023-09-27 18:28:26
我正在尝试以各种不同的顺序打印文档。现在我有一个打印对象的集合和一个XML文档,其中每个节点都有与集合中的打印对象关联的属性。我想通过基于这些属性对XML文档进行排序来对这些对象进行排序。
现在,我正在使用一系列循环使用的集合,并根据需要完成的排序将节点添加到新集合中。问题有三到四种,因为它变得一团糟。我确信必须有一种更好的方法来对打印对象的集合进行排序,不管是否使用XML。
以下是我正在排序的XML的一些属性:
- #共页
- 文件中列出的邮政编码
- 文件名称
有人有更好的主意吗?
谢谢,
编辑-
我的文件看起来像
<xml>
<claim key="1" att1="wd" att2="de"/>
<claim key="2" att1="wd" att2="de"/>
<claim key="3" att1="wd" att2="de"/>
<claim key="4" att1="wd" att2="de"/>
</xml>
键值与打印对象集合中的点相关联。声明节点可能有更多的子节点,但我认为这在这一点上不相关。我只想能够根据属性进行排序,至少会有3个属性,但可能会添加更多。此外,这需要是通用的,所以如果我需要切换排序顺序,它应该很容易重新排列。一旦XML按我想要的正确顺序排列,我就会在XML中使用一个循环,将键放入列表中,然后按该列表中的键打印出print对象。
谢谢,
我在LINQPad中尝试了这个例子,它似乎符合您的要求。
var root = XDocument.Parse("<xml><claim>...</claim></xml>").Element("xml");
var query = from claim in root.Elements("claim")
let key = claim.Attributes("key").First().Value
let att1 = claim.Attributes("att1").First().Value
let att2 = claim.Attributes("att2").First().Value
orderby key, att1, att2
select claim;
它在XML中查找<claim>
节点,选择要排序的属性,对它们进行排序,然后返回一个代表已排序的<claim>
节点的IEnumerable<XElement>
集合。
然后,您可以使用query
结果来构建Print
对象,或者您可以更改上面的内容,让它为您做这件事:
var query2 = from claim in root.Elements("claim")
let key = claim.Attributes("key").First().Value
let att1 = claim.Attributes("att1").First().Value
let att2 = claim.Attributes("att2").First().Value
orderby key, att1, att2
select new Print {
Property1 = key, // do type conversion if needed
Property2 = att1,
Property3 = att2
};
我认为它符合您提到的可维护性要求——如果需要不同的排序,您只需要更改LINQ查询中的添加/删除/更改属性名称。
编辑:根据您下面的评论,将密钥放入int
列表:
var printKeys = (from claim in query
select Integer.Parse(claim.Attributes("key").First().Value)).ToList();