0

假设我有这个 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 用这个代码:

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 吗?

谢谢你。

4

2 回答 2

1

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

返回 XPath 正确顺序(文档顺序的 insted)

于 2013-06-21T15:06:41.007 回答
1

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

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

于 2013-06-21T16:45:42.317 回答