2012-03-19 37 views
0

我试图以各种不同的顺序打印文档。现在我有一组打印对象和一个XML文档,每个节点的属性都与集合中的打印对象相关联。我想通过基于这些属性对XML文档进行排序来对这些对象进行排序。XML排序选项C#.Net

现在我正在使用一系列的集合,我骑自行车并根据需要完成的排序将节点添加到新集合中。问题是3或4种,它变得混乱。我确信必须有更好的方法来排序这个打印对象的集合,使用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对象。

    感谢,

  • +0

    您可以发布该文件的一个例子,你是如何连接的XML节点打印对象,请?这将有很大的帮助。 – deadlyvices 2012-03-19 13:08:55

    +2

    我会建议可能有一些LINQ与一些分组和排序会帮助你,但是我们必须看看XML看起来像给你什么具体的例子。 [这是一篇文章](http://stackoverflow.com/questions/5013710/linq-order-by-group-by-and-order-by-each-group)让你知道我在说什么。 – 2012-03-19 13:11:11

    回答

    1

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

    它发现<claim>节点在你的XML,选择在您希望进行排序的属性,对其进行排序,然后返回一个IEnumerable<XElement>收集代表排序<claim>节点。

    然后,您可以使用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(); 
    
    +0

    这看起来像它将适用于我所需要的,我唯一的问题是,因为我对c#有点新,所以我如何循环访问IEnumerable 集合,以便我可以将Key值放入一个ints列表中。我不会按键排序,关键只是让我找出打印obj集合中的哪个位置来打印。 – kds6253 2012-03-19 13:50:25

    +0

    @ kds6253:我更新了我的答案。 – 2012-03-19 13:54:17

    +0

    谢谢,我现在正在使用它。你有没有建议阅读XDocument和你使用的solutuon。我想更多地阅读它,这个解决方案比我最初想到的要简单100倍,我想知道这种解决方案可以用在哪里。 – kds6253 2012-03-19 13:57:29