使用XPath连接两个节点集

时间:2013-06-21 14:36:32

标签: c# xpath xpathdocument

假设我有这个HTML文件:

<html>
    <table class="class1">
        <tr>
            <td>1</td>
            <td>2</td>
        </tr>
        <tr>
            <td>1</td>
            <td>2</td>
        </tr>
    </table>

    <table class="class2">
        <tr>
            <td>a</td>
            <td>b</td>
            <td>c</td>
            <td>d</td>
            <td>e</td>
        </tr>
    </table>

    <table class="class3">
        <tr>
            <td>3</td>
            <td>4</td>
            <td>5</td>
        </tr>
        <tr>
            <td>3</td>
            <td>4</td>
            <td>5</td>
        </tr>
    </table>
</html>

我想使用XPath查询此文件以获得此结果:1234512345 with this code:

var xNavigator = xPathDoc.CreateNavigator();
var iterator = xNavigator.Select("//html/table[@class='class1']/tr/td|//html/table[@class='class3']/tr/td");
while (iterator.MoveNext())
    Console.Write(iterator.Current.InnerXml);

但结果是:1212345345

您有什么想法我怎样才能获得1234512345而不是1212345345?

谢谢。

2 个答案:

答案 0 :(得分:1)

我认为你需要执行两个Select。如下面的讨论中所述,XPath 1.0(.NET支持的唯一版本)不定义节点顺序,并且实现都按文档顺序返回节点。

Returning XPath correct order ( insted of document order)

答案 1 :(得分:1)

既然你正在谈论“节点集”,我认为你正在使用XPath 1.0 - 你真的应该这么说。 XPath 1.0中的节点集是一组没有特定顺序的节点;但是,XSLT总是以文档顺序处理节点集中的节点,这已经建立了一个先例,据我所知,所有XPath 1.0处理器都遵循它们是否在XSLT中使用。因此,返回节点集的表达式很可能按文档顺序返回节点,这是您正在观察的效果。

XPath 2.0引入了序列,允许您以自己选择的任何顺序返回节点。