1. 程式人生 > >odoo 中的 xpath 語法(簡概 一)

odoo 中的 xpath 語法(簡概 一)

大家好,

很多朋友在odoo 開發的時候,都遇到需要使用 xpath 修改繼承檢視的情況。我們這裡就簡單總結一下xpath 是什麼:[資料結構]

首先:

我們希望告訴電腦,我們的組織是這樣一個架構,通過xml實現:

xpath_v_1

如何寫程式碼呢?

<?xml version="1.0" encoding="ISO-8859-1"?>
<openerphk>
<odoohk>
  <title lang="eng">Chief Executive Officer</title>
  <position>Systems Engineer</position>
</odoohk>
<odoohk>
  <title lang="eng">Vice President</title>
  <position>Python Developer</position>
</odoohk>
<openerphk>
  <title lang="eng">Senior Engineer</title>
  <position>Node.js Developer</position>
</openerphk>
</openerp>

第二:語法

我們,查詢架構中的人員

表示式 描述
nodename 選取此節點的所有子節點。
/ 從根節點選取。
// 從匹配選擇的當前節點選擇文件中的節點,而不考慮它們的位置。
.. 選取當前節點的父節點。
@ 選取屬性。

第三:路徑語法

表示式 結果
/openerp/odoohk[1] 選取屬於 openerp 子元素的第一個 odoohk 元素。
/openerp/odoohk[last()] 選取屬於openerp 子元素的最後一個 odoohk 元素。
/openerp/odoohk[last()-1] 選取屬於 openerp 子元素的倒數第二個 odoohk 元素。
/openerp/odoohk[position()<3] 選取最前面的兩個屬於 openerp 元素的子元素的 odoohk 元素。
//title[@lang] 選取所有擁有名為 lang 的屬性的 title 元素。
//title[@lang=’eng’] 選取所有 title 元素,且這些元素擁有值為 eng 的 lang 屬性。
/openerp/odoohk[contains(.,'Developer')]/title 選取 openerp 元素中的 odoohk 元素的所有 title 元素,且其中有元素且其值須含有 Developer。

第四:模糊查詢節點

  • | 匹配任何元素節點。
    @* | 匹配任何屬性節點。

node() | 匹配任何型別的節點。

例項

路徑表示式 結果
/openerp/* 選取 openerp 元素的所有子元素。
//* 選取文件中的所有元素。
//title[@*] 選取所有帶有屬性的 title 元素。

第五:選取多條路徑

通過在路徑表示式中使用“|”運算子,選取多個路徑。

//odoohk/title | //odoohk/position

選取 odoohk 元素的所有 title 和 position 元素。

//title | //position

選取文件中的所有 title 和 position 元素。

/openerp/odoohk/title |  //position

選取屬於 openerp 元素的 odoohk 元素的所有 title 元素,以及文件中所有的position 元素。

第六:軸

如圖,我們需要找到標紅星星的節點:

xpath_v_2

程式碼:

//odoohk[contains(text(), ‘Developer’)]/parent::openerp/odoohk[contains(text(), ‘Engineer’)]
標題1 標題2
child::book 選取所有屬於當前節點的子元素的 odoohk節點。
attribute::lang 選取當前節點的 lang 屬性。
child::* 選取當前節點的所有子元素。
attribute::* 選取當前節點的所有屬性。
child::text() 選取當前節點的所有文字子節點。
child::node() 選取當前節點的所有子節點。
descendant::odoohk 選取當前節點的所有 odoohk 後代。
ancestor::odoohk 選擇當前節點的所有 odoohk 先輩。
ancestor-or-self::odoohk 選取當前節點的所有 odoohk 先輩以及當前節點(如果此節點是 odoohk 節點)
child::*/child::position 選取當前節點的所有 position孫節點。

總結

謝謝大家!歡迎提供意見!