2012-09-10 59 views
1

我想排序函数如下所述的可选属性的一些XML节点的LINQ to XML:在可选属性的功能排序XML节点

<ncx xmlns="http://www.daisy.org/z3986/2005/ncx/"> 
<head> 
    <meta name="dtb:uid" content="http://www.hxa7241.org/articles/content/epup-guide_hxa7241_2007_1.epub" /> 
</head> 
<docTitle> 
    <text>Roméo et Juliette</text> 
</docTitle> 
<navMap> 
    <navPoint id="toc" playOrder="2"> 
     <navLabel> 
      <text>Table des Matières</text> 
     </navLabel> 
     <content src="9789999997049_toc.html" /> 
    </navPoint> 
    <navPoint id="tp" playOrder="1"> 
     <navLabel> 
      <text>Page de Titre</text> 
     </navLabel> 
     <content src="9789999997049_tp.html" /> 
    </navPoint> 
    <navPoint id="p01" playOrder="3"> 
     <navLabel> 
      <text>ACTE PREMIER</text> 
     </navLabel> 
     <content src="9789999997049_p01.html" /> 
     <navPoint id="ch02" playOrder="5"> 
     <navLabel> 
      <text>Sc&#232;ne 2</text> 
     </navLabel> 
     <navPoint id="ch01" playOrder="4"> 
      <navLabel> 
       <text>Scène première</text> 
      </navLabel> 
      <content src="9789999997049_ch01.html" /> 
     </navPoint> 
     <content src="9789999997049_ch02.html"/> 
    </navPoint> 
    </navPoint> 
</navMap> 

我怎样才能在的navPoint节点进行排序在playOrder属性函数中是否存在,如果不存在则正常检索xml?我应该首先测试playOrder是否存在,然后创建一个不同的Linq查询,或者是否可以用单个语句处理所有事情(可能是一个案例)?

回答

1

这是最简单的通过,只是转换为可空类型和秩序:

var sorted = navPoints.OrderBy(x => (int?) x.Attribute("playOrder")); 

这将使空值,如果属性不存在;所有这些条目最终都会排在第一位(IIRC)。