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对象。

谢谢,

XML排序选项C#.Net

我在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();