2016-11-12 25 views
1

我得到這個XML並要求指出表達多少個元素返回:數據庫XPath查詢

<a> 
    <a> 
    <a>1</a> 
    <a>2</a> 
    </a> 
    <a> 
    <a>3</a> 
    <a>4</a> 
    </a> 
</a> 

中的XPath查詢是:

i) //a[a/text()=3]/a 

ii) //a[a/a/text()=3]/a/a 

iii) //a[a/text()=2][a/text()=3] 

而且給出的答案是我)2, ii)4,iii)0

但是,我在嘗試理解時遇到了一些問題。對於我),

我的理解是首先我檢查謂詞。 //表示後代或自我,這意味着我正在檢查// a/a/3。由於我在上述路徑中找到了3,所以

<a> 
    <a> 
    <a>3</a> 
    <a>4</a> 
    </a> 
</a> 

所以謂詞是真的。然後,我執行,即//一個的XPath查詢/一個將返回我2作爲此塊:

<a> 
    <a>3</a> 
    <a>4</a> 
</a> 

包含2內。然後對於ii),首先我檢查謂詞// a/a/a/3,與上面相同,我得到了該路徑。由於謂詞返回true,所以我將執行XPath查詢,例如// a/a/a。但它不應該返回爲1,因爲我在看這個:

<a> 
    <a> 
    <a>1</a> 
    </a> 
</a> 

我真的很困惑如何跟蹤它,我敢肯定,我的觀念是錯誤的,因爲答案是錯的。有沒有簡單的方法來做到這一點,或者一些更好的例子?

提前致謝!

回答

2

我將嘗試解釋第一個XPath爲例。在閱讀此答案後,通過將您剛纔瞭解的內容應用於XPath的其餘部分來測試您的理解。

  • //a:找到所有a元素,在文檔中的任意位置。到目前爲止,將返回7個元素。
  • [a/text()=3]:過濾由上面的XPath發現那些具有子元素a其中子文本節點的一等於3a元件。到目前爲止,只有一個元素會被返回; 父母<a>3</a>
  • /a:返回子元素a<a>3</a>元素找到由以前的XPath。這意味着整個XPath將返回2個元素,因爲有兩個a元素是的子元素<a>3</a>的父元素。

Demo 1

輸出:

<a>3</a> 
<a>4</a> 

UPDATE:

只是意識到你對第二XPath而不是第一個感到困惑。但是你對第一個問題的理解也有些偏差,所以我期望最初的答案仍然有用。以下是有關第二XPath的簡要說明:

  • //a:找到所有a元素,在文檔中的任意位置。到目前爲止,將返回7個元素。
  • [a/a/text()=3]:謂詞中的表達式將匹配<a>3</a>的父項。所以到目前爲止,整個XPath只匹配一個元素; 的根元素
  • /a/a:從先前的XPath找到的根元素中,返回所有的grand-child a元素。所以整個XPath返回4個元素

Demo 2

+0

感謝您的解釋!但只是與你有關最後一個問題的快速檢查,所以// a返回7個元素。然後第一個謂詞基本上找到文本節點等於2的那個,在這種情況下,我只剩下的父項。然後,在那之後,我執行另一個謂詞來查找3,但由於我只剩下父項2,而3在另一個父項中,所以我找不到任何並因此返回0?我在正確的軌道上嗎? –

+0

@WhoamI你走了!這就是最後一個XPath的工作原理。恭喜! – har07