Tutorial XPath

Dalam tutorial ini, anda diperkenalkan dengan bahasa XPath, iaitu bahasa kueri atau pertanyaan yang boleh digunakan untuk memilih bahagian arbitrari HTML dokumen di dalam calibre. XPath merupakan piawaian yang banyak digunakan, dan jika anda mencari di dalam google akan dapati sangat banyak maklumat mengenai. Walaubagaimanapun, tutorial ini lebih fokuskan pada penggunaan XPath untuk tugasan berkaitan e-buku seperti mencari pengepala bab di dalam dokumen HTML tidak berstruktur.

Memilih berdasarkan nama tag

Bentuk paling ringkas pemilihan ialah dengan memilih tag mengikut nama. Contohnya, anda mahu memilih semua tag <h2> di dalam dokumen. Pertanyaan XPath untuk ini hanyalah simply:

//h:h2        (Selects all <h2> tags)

Awalan // bermaksud gelintar pada mana-mana aras dokumen. Sekarang anda mahu gelintar tag <span> yang berada di dalam tag <a> tags. Ia boleh dibuat dengan:

//h:a/h:span    (Selects <span> tags inside <a> tags)

Jika anda mahu gelintar tag pada aras tertentu di dalam dokumen, ubah prefix:

/h:body/h:div/h:p (Selects <p> tags that are children of <div> tags that are
             children of the <body> tag)

Ini hanya padankan <p>A very short ebook to demonstrate the use of XPath.</p> di dalam E-buku sampel tetapi bukan pada mana-mana tag <p> yang lain. Awalan h: dalam contoh di atas diperlukan untuk memadani tag XHTML. Ini kerana secara dalaman, calibre mewakili semua kandungan sebagai XHTML. Dalam tag XHTML yang mempunyai namespace, dan h: merupakan awalan ruang nama untuk tag HTML.

Sekarang anda mahu memilih kedua-dua tag <h1> dan <h2>. Untuk membuatnya,m kita perlukan konstruk XPath yang dikenali sebagai predikat. Predikat :dfn: ialah ujian yang digunakan untuk memilih tag. Ujian boleh jadi berguna sepanjang tutorial ini dijalanakn, anda akan lihat lagu beberapa contoh yang berguna. Predikat dicipta dengan menutup ungkapan ujian dengan simbol kurungan:

//*[name()='h1' or name()='h2']

Terdapat beberapa fitur baharu di dalam ungkapan XPath ini. Yang pertama ialah penggunaan kad liar *. Ia bermaksud padan mana-mana tag. Sekarang lihat pada ungkapan uji name()='h1' atau name()='h2'`. name() ialah contoh fungsi terbina-dalam. Ia hanyalah menilai nama tag. Oleh itu dengan menggunakannya, kita boleh memilih tag yang namanya sama ada h1 atau h2. Perhatian, fungsi name() mengabaikan ruang nama supaya tidak memerlukan awalan h:. XPath mempunyai beberapa fungsi terbina-dalam yang berguna. Ada beberapa lagi fungsi akan diperkenalkan di dalam tutorial ini.

Memilih berdasarkan atribut

Untuk memilih tag berdasarkan atribut mereka, penggunaan predikat diperlukan:

//*[@style]              (Select all tags that have a style attribute)
//*[@class="chapter"]    (Select all tags that have class="chapter")
//h:h1[@class="bookTitle"] (Select all h1 tags that have class="bookTitle")

Di sini, operator @ merujuk pada atribut tag. Anda boleh guna beberapa fungsi terbina-dalam XPath untuk membuat padanan lebih kompleks pada nilai atribut.

Memilih berdasarkan kandungan tag

Dengan menggunakan XPath, anda boleh pilih tag berdasarkan pada teks yang dikandunginnya. Cara terbaik membuatnya ialah denga gunakan kehebatan ungkapan nalar melalui fungsi terbina-dalam re:test():

//h:h2[re:test(., 'chapter|section', 'i')] (Selects <h2> tags that contain the words chapter or
                                          section)

Di sini operator . merujuk pada kandungan tag, sepertimana operator @ merujuk pada atributnya.

E-buku sampel

<html>
    <head>
        <title>A very short e-book</title>
        <meta name="charset" value="utf-8" />
    </head>
    <body>
        <h1 class="bookTitle">A very short e-book</h1>
        <p style="text-align:right">Written by Kovid Goyal</p>
        <div class="introduction">
            <p>A very short e-book to demonstrate the use of XPath.</p>
        </div>

        <h2 class="chapter">Chapter One</h2>
        <p>This is a truly fascinating chapter.</p>

        <h2 class="chapter">Chapter Two</h2>
        <p>A worthy continuation of a fine tradition.</p>
    </body>
</html>

Fungsi terbina-dalam XPath

name()

Nama bagi tag semasa

contains()

contains(s1, s2) kembali true jika s1 mengandungi s2.

re:test()

re:test(src, pattern, flags) returns true if the string src matches the regular expression pattern. A particularly useful flag is i, it makes matching case insensitive. A good primer on the syntax for regular expressions can be found at regexp syntax