首页 文章

存储没有唯一字段的XML .

提问于
浏览
1

我有一个大的xml文件,我想排序,但我对如何处理这种情况有点生疏 .

我有一个大约40k行的大xml文件,但是这个xml文件没有我可以用来排序的独特元素 .

是否有可能按2个元素订购?

<Customer>
   <row CompanyID="1" Name="John" Email="John@mail.com" \>
   <row CompanyID="1" Name="Jane" Email="Jane@mail.com" \>
   <row CompanyID="1" Name="Howard" Email="Howard@mail.com" \>
   <row CompanyID="2" Name="Jen" Email="Jen@mail.com" \>
   <row CompanyID="2" Name="James" Email="James@mail.com" \>
   <row CompanyID="3" Name="Phil" Email="Phil@mail.com" \>
   <row CompanyID="3" Name="Kenny" \>
   <row CompanyID="3" Name="Andrew" Email="Andrew@mail.com" \>
   <row CompanyID="3" Name="Greg" Email="Greg@mail.com" \>
   <row CompanyID="4" Name="Julia" Email="Julia@mail.com" \>
   <row CompanyID="4" Name="Hannah" Email="Hannah@mail.com" \>
   <row CompanyID="4" Name="Riley" Email="" \>
   <row CompanyID="4" Name="Anders" Email="Anders@mail.com" \>
</Customer>

让我说我首先开始按公司ID订购,即11122333等等......而我也想按电子邮件排序 . (请注意,缺少一封电子邮件)

这是使用CompanyID的第一个数字,然后如果存在则通过电子邮件进行alfabetically .

哪会给我结果(休息只是代表):

<Customer>
   <row CompanyID="1" Name="Howard" Email="Howard@mail.com" \>
   <row CompanyID="1" Name="Jane" Email="Jane@mail.com" \>
   <row CompanyID="1" Name="John" Email="John@mail.com" \>

   <row CompanyID="2" Name="Bill" Email="Bill@mail.com" \>
   <row CompanyID="2" Name="Jen" Email="Jen@mail.com" \>

   <row CompanyID="3" Name="Andrew" Email="Andrew@mail.com" \>
   <row CompanyID="3" Name="Greg" Email="Greg@mail.com" \>
   <row CompanyID="3" Name="Phil" Email="Phil@mail.com" \>
   <row CompanyID="3" Name="Kenny" \>

   <row CompanyID="4" Name="Anders" Email="Anders@mail.com" \>
   <row CompanyID="4" Name="Hannah" Email="Hannah@mail.com" \>
   <row CompanyID="4" Name="Julia" Email="Julia@mail.com" \>
   <row CompanyID="4" Name="Riley" Email="" \>
</Customer>

另请注意,一个Email属性完全丢失,另一个只是空 .

现在它只是按“CompanyID”排序,它给了我111223333 ......等等 .

var xml = xDoc.Element("Customer")
            .Elements("row")
            .OrderBy(s => (int)s.Attribute("CompanyID"));

我需要通过电子邮件排序的原因是,电子邮件在这种情况下是独一无二的,坏的是它们并非在每个记录中都可以这么说 .

谢谢你的帮助 .

1 回答

  • 1

    你需要使用ThenBy扩展方法:

    var xml = xDoc.Element("Customer")
            .Elements("row")
            .OrderBy(s => (int)s.Attribute("CompanyID"))
            .ThenBy(s =>string.IsNullOrEmpty((string)s.Attribute("Email"))?"ZZZ":(string)s.Attribute("Email"));
    

    使用条件运算符,您可以使用默认值(例如,"ZZZ")将 Email 属性的元素设置为空,并且在结果的末尾不使用 Email 属性 .

相关问题