2013-06-21 127 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

我想我知道你想要什麼,但這個例子是不明確的。對其進行更改,以便表格單元格具有唯一值(對於class1表可能是1-4,對於class3表可能是A-F)。然後描述你想要的。 –

+0

我但它是這樣的,因爲每個單元格都有它自己的數據(類型:日期可能或特定值)!但是那裏的數字即將告訴你需要按順序存儲這些數據:來自表calss1的所有單元格隨後是表class2中的所有單元格,並且一次又一次 –

+0

請注意,「|」不是連接運算符,而是聯合運算符。 XPath 1.0中沒有節點集連接操作符,因爲集沒有定義的順序,所以連接沒有意義。爲了跟蹤自定義順序,您需要序列,這需要XPath 2.0。或者像@MichaelGunter建議的那樣使用C#環境的功能。 – 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

如果可能的話,我只能在一個Select中執行該操作。問題不在於C#代碼,而在於XPath! :) –

+1

@AladdinGallas:你的問題的答案是XPath不能滿足你所​​要求的,只需要一個Select。 – LarsH

+0

@LarsH:謝謝! –