Объединить два набора узлов с XPath
Предположим, у меня есть этот 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?
Спасибо.
2 ответа
Поскольку вы говорите "наборы узлов", я предполагаю, что вы используете XPath 1.0 - вам действительно следует так сказать. Набор узлов в XPath 1.0 - это набор узлов без определенного порядка; однако XSLT всегда обрабатывает узлы в наборе узлов в порядке документов, и это создает прецедент, который, насколько мне известно, следует всем процессорам XPath 1.0, независимо от того, используются они в XSLT или нет. Поэтому выражения, которые возвращают наборы узлов, вероятно, будут возвращать узлы в порядке документа, что является эффектом, который вы наблюдаете.
В XPath 2.0 представлены последовательности, которые позволяют возвращать узлы в любом порядке по вашему выбору.
Я думаю, что вам нужно будет выполнить два Select
s. Как описано в обсуждении ниже, XPath 1.0 (единственная версия, в которой поддерживается.NET) не определяет порядок узлов, и все реализации возвращают узлы в порядке документов.
Возврат XPath правильного порядка (вставлен в порядок документов)