2013-06-21 6 views
0

Предположим, что у меня есть этот HTML-файл:Объединить два набора узлов с помощью XPath

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

спасибо.

+0

Я думаю, что знаю, чего вы хотите, но этот пример неоднозначен. Измените его так, чтобы ячейки таблицы имели уникальные значения (возможно, 1-4 для таблицы class1 и A-F для таблицы class3). Затем опишите, что вы хотите. –

+0

Я, но это так, потому что каждая ячейка имеет свои собственные данные (тип: дата может быть или конкретные значения)! но число, которое покажет вам необходимость иметь эти данные в порядке: все ячейки из таблицы calss1, а затем все ячейки в таблице class2 снова и снова –

+0

Обратите внимание, что '|' не является оператором конкатенации, а является оператором объединения. В XPath 1.0 нет оператора конкатенации узлов, потому что наборы не имеют определенного порядка, поэтому конкатенация не имеет смысла. Чтобы отслеживать заказ, вам нужны последовательности, для которых требуется XPath 2.0. Или используйте функции среды C#, как предлагал @MichaelGunter. – LarsH

ответ

1

Так как вы говорите «множество узлов» Я предполагаю, что вы используете XPath 1.0 - вы действительно должны так сказать. Набор узлов в XPath 1.0 представляет собой набор узлов без определенного порядка; однако XSLT всегда обрабатывает узлы в наборе узлов в порядке документа, и это установило прецедент, который, насколько я знаю, все процессоры XPath 1.0 следуют за тем, используются ли они в XSLT или нет. Таким образом, выражения, которые возвращают узлы-узлы, скорее всего, вернут узлы в порядке документа, что является следствием того, что вы наблюдаете.

В XPath 2.0 представлены последовательности, которые позволяют вам возвращать узлы в любом порядке по вашему выбору.

1

Думаю, вам нужно будет выполнить два Select s. Как описано в обсуждении ниже, XPath 1.0 (который является единственной версией .NET, поддерживающей) не определяет порядок узлов, и все реализации возвращают узлы в порядке документа.

Returning XPath correct order (insted of document order)

+0

Я должен выполнить это только в одном Выберите, если это возможно. Вопрос не в коде C#, а в XPath! :) –

+1

@AladdinGallas: и ответ на ваш вопрос заключается в том, что XPath неспособен к тому, что вы просите, в одном Select. – LarsH

+0

@ LarsH: Спасибо! –