1

我想根据可选属性对下面描述的一些 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>

如果 playOrder 属性函数存在,如何对 navpoint 节点进行排序,如果不存在,如何正常检索 xml?我应该先测试 playOrder 是否存在,然后进行不同的 Linq 查询,还是可以用一条语句处理所有事情(可能有一个案例)?

4

1 回答 1

1

最简单的方法是转换为可为空的类型并按以下顺序排序:

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

如果属性不存在,这将给出 null 值;所有这些条目最终都会在排序集合中排在第一位(IIRC)。

于 2012-09-10T14:50:15.743 回答