mata teras
query()
. Walaupun kedua -duanya melakukan pertanyaan, perbezaannya ialah jenis hasil yang mereka kembali, evaluate()
pulangan query()
, sementara DOMNodeList
mengembalikan hasil yang ditaip sebanyak mungkin. evaluate()
<!DOCTYPE library [ <!ELEMENT library (book*)> <!ELEMENT book (title, author, genre, chapter*)> <!ATTLIST book isbn ID #REQUIRED> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT genre (#PCDATA)> <!ELEMENT chapter (chaptitle,text)> <!ATTLIST chapter position NMTOKEN #REQUIRED> <!ELEMENT chaptitle (#PCDATA)> <!ELEMENT text (#PCDATA)> ]>
<?xml version="1.0" encoding="utf-8"?> <library> <book isbn="isbn1234"> <title>A Book</title> <author>An Author</author> <genre>Horror</genre> <chapter position="first"> <chaptitle>chapter one</chaptitle> <text></text> </chapter> </book> <book isbn="isbn1235"> <title>Another Book</title> <author>Another Author</author> <genre>Science Fiction</genre> <chapter position="first"> <chaptitle>chapter one</chaptitle> <text>Sit Dolor Amet...</text> </chapter> </book> </library>
Asas XPath Query
XPath adalah sintaks untuk menanyakan dokumen XML. Bentuk yang paling mudah adalah untuk menentukan jalan ke elemen yang anda ingin akses. Menggunakan dokumen XML di atas, pertanyaan XPath berikut mengembalikan koleksi semua elemen yang sedia ada: book
//library/book
adalah unsur -unsur akar dokumen, dan satu slash tunggal menunjukkan library
adalah elemen anaknya. Sangat mudah, bukan? Tetapi bagaimana jika anda mahu menentukan buku tertentu? Katakan anda ingin mengembalikan mana -mana buku yang ditulis oleh "penulis". XPath akan menjadi: book
//library/book/author[text() = "An Author"]/..
untuk melakukan perbandingan pada nilai nod dalam kurungan persegi, dan trailing "/.." bermakna kita mahu elemen induk (iaitu memindahkan satu nod ke atas). Pertanyaan XPath boleh dilakukan menggunakan salah satu daripada dua fungsi: text()
dan query()
. Kedua -duanya melakukan pertanyaan, tetapi perbezaannya adalah jenis hasil yang mereka kembali. evaluate()
akan sentiasa kembali query()
, dan DOMNodeList
mengembalikan hasil yang ditaip sebanyak mungkin. Sebagai contoh, jika pertanyaan XPath anda mengembalikan bilangan buku yang ditulis oleh penulis tertentu dan bukannya buku sebenar itu sendiri, maka evaluate()
akan mengembalikan kosong query()
. DOMNodeList
akan mengembalikan nombor secara langsung, jadi anda boleh menggunakannya dengan segera tanpa perlu mengekstrak data dari nod. evaluate()
Kod dan Kelajuan Kod XPath
mari kita membuat demonstrasi cepat, mengembalikan bilangan buku yang ditulis oleh pengarang tertentu. Kami akan terlebih dahulu melihat pendekatan yang berdaya maju, tetapi ia tidak menggunakan XPath. Ini adalah untuk menunjukkan kepada anda bagaimana untuk melakukan ini tanpa menggunakan XPath dan mengapa XPath sangat kuat.
<!DOCTYPE library [ <!ELEMENT library (book*)> <!ELEMENT book (title, author, genre, chapter*)> <!ATTLIST book isbn ID #REQUIRED> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT genre (#PCDATA)> <!ELEMENT chapter (chaptitle,text)> <!ATTLIST chapter position NMTOKEN #REQUIRED> <!ELEMENT chaptitle (#PCDATA)> <!ELEMENT text (#PCDATA)> ]>
Kaedah seterusnya mencapai hasil yang sama, tetapi menggunakan XPath untuk memilih buku yang ditulis hanya oleh pengarang tertentu:
<?xml version="1.0" encoding="utf-8"?> <library> <book isbn="isbn1234"> <title>A Book</title> <author>An Author</author> <genre>Horror</genre> <chapter position="first"> <chaptitle>chapter one</chaptitle> <text></text> </chapter> </book> <book isbn="isbn1235"> <title>Another Book</title> <author>Another Author</author> <genre>Science Fiction</genre> <chapter position="first"> <chaptitle>chapter one</chaptitle> <text>Sit Dolor Amet...</text> </chapter> </book> </library>
Sila ambil perhatian bahawa kami menghapuskan keperluan PHP untuk menguji nilai pengarang kali ini. Walau bagaimanapun, kita boleh melangkah lebih jauh dan menggunakan fungsi XPath count()
untuk mengira bilangan kejadian jalan ini.
//library/book
kami hanya memerlukan satu baris XPath untuk mendapatkan maklumat yang diperlukan tanpa perlu menggunakan PHP untuk melakukan penapisan susah payah. Malah, ini adalah cara yang lebih mudah dan lebih ringkas untuk menulis ciri ini! Perhatikan bahawa evaluate()
digunakan dalam contoh terakhir. Ini kerana fungsi count()
mengembalikan hasil yang ditaip. Menggunakan query()
akan kembali DOMNodeList
, tetapi anda akan mendapati bahawa ia adalah senarai kosong. Ini bukan sahaja menjadikan kod anda lebih ringkas, tetapi juga mempunyai kelebihan kelajuan. Saya mendapati bahawa versi 1 mempunyai kelajuan purata 30% lebih cepat daripada versi 2, tetapi versi 3 adalah kira -kira 10% lebih cepat daripada versi 2 (kira -kira 15% lebih cepat daripada versi 1). Walaupun pengukuran ini berbeza -beza berdasarkan pelayan dan pertanyaan anda, menggunakan XPath tulen sering membawa manfaat kelajuan yang besar sementara juga membuat kod anda lebih mudah dibaca dan diselenggara.
fungsi xpath
XPath boleh menggunakan banyak fungsi, dan terdapat banyak sumber yang sangat baik yang memperincikan fungsi yang tersedia. Jika anda mendapati diri anda melelehkan DOMNodeLists
atau membandingkan nodeValues
, anda mungkin mendapati fungsi XPath yang menghapuskan banyak kod PHP. Anda telah melihat penggunaan fungsi count()
. Mari kita gunakan fungsi id()
untuk mengembalikan tajuk buku dengan ISBN yang diberikan. Ekspresi XPath yang perlu anda gunakan ialah:
//library/book/author[text() = "An Author"]/..
Perhatikan bahawa nilai-nilai yang akan dicari di sini disertakan dalam petikan dan dipisahkan oleh ruang;
<?php public function getNumberOfBooksByAuthor($author) { $total = 0; $elements = $this->domDocument->getElementsByTagName("author"); foreach ($elements as $element) { if ($element->nodeValue == $author) { $total++; } } return $total; // 修正:这里应该是 $total,而不是 $number } ?>
Melaksanakan fungsi kompleks di XPath adalah agak mudah;
menggunakan fungsi php dalam xpath
Kadang -kadang anda mungkin mendapati diri anda memerlukan beberapa ciri yang lebih kuat yang fungsi XPath standard tidak dapat disediakan. Nasib baik, PHP Dom juga membolehkan anda mengintegrasikan fungsi PHP sendiri ke dalam pertanyaan XPath. Mari kita pertimbangkan untuk mengembalikan bilangan perkataan dalam tajuk buku. Fungsi yang paling mudah, kita boleh menulis kaedah seperti ini:
<!DOCTYPE library [ <!ELEMENT library (book*)> <!ELEMENT book (title, author, genre, chapter*)> <!ATTLIST book isbn ID #REQUIRED> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT genre (#PCDATA)> <!ELEMENT chapter (chaptitle,text)> <!ATTLIST chapter position NMTOKEN #REQUIRED> <!ELEMENT chaptitle (#PCDATA)> <!ELEMENT text (#PCDATA)> ]>
terus ke dalam pertanyaan XPath. Beberapa langkah perlu diselesaikan untuk ini. Pertama, kita mesti mendaftarkan ruang nama menggunakan objek XPath. Fungsi PHP dalam pertanyaan XPath bermula dengan "str_word_count()
. Ruang nama mesti ditetapkan untuk ini; Kemudian kita perlu memanggil php:functionString
, yang memberitahu PHP bahawa setiap kali kita menghadapi fungsi dengan "http://php.net/xpath
" sebagai ruang nama, ia harus dikendalikan oleh PHP. Sintaks sebenar untuk memanggil fungsi adalah: registerPHPFunctions()
php:
<?xml version="1.0" encoding="utf-8"?> <library> <book isbn="isbn1234"> <title>A Book</title> <author>An Author</author> <genre>Horror</genre> <chapter position="first"> <chaptitle>chapter one</chaptitle> <text></text> </chapter> </book> <book isbn="isbn1235"> <title>Another Book</title> <author>Another Author</author> <genre>Science Fiction</genre> <chapter position="first"> <chaptitle>chapter one</chaptitle> <text>Sit Dolor Amet...</text> </chapter> </book> </library>
Perhatikan bahawa anda tidak perlu memanggil fungsi XPath getNumberOfWords()
untuk memberikan teks nod. Kaedah
//library/book
text()
Daftar fungsi PHP tidak terhad kepada fungsi yang datang dengan PHP. Anda boleh menentukan fungsi anda sendiri dan memberikannya di XPath. Satu -satunya perbezaan ialah apabila menentukan fungsi yang anda gunakan "registerPHPFunctions()
" bukannya "
//library/book/author[text() = "An Author"]/..
php:function
php:functionString
Argumen yang diserahkan kepada fungsi adalah pelbagai true
. Fungsi ini bertanggungjawab untuk melelehkan array dan menentukan sama ada nod yang akan diuji hendaklah dikembalikan dalam
<?php public function getNumberOfBooksByAuthor($author) { $total = 0; $elements = $this->domDocument->getElementsByTagName("author"); foreach ($elements as $element) { if ($element->nodeValue == $author) { $total++; } } return $total; // 修正:这里应该是 $total,而不是 $number } ?>
untuk menentukan. Sekarang kita boleh membuat kaedah DOMElements
: DOMNodeList
/book
/author
Jika getGeorgeOrwellBooks()
adalah kaedah statik, maka anda perlu mengubah suai pertanyaan XPath untuk dibaca:
<?php public function getNumberOfBooksByAuthor($author) { $query = "//library/book/author[text() = '$author']/.."; $xpath = new DOMXPath($this->domDocument); $result = $xpath->query($query); return $result->length; } ?>
Malah, semua ciri -ciri ini boleh ditulis dengan mudah dalam XPath sahaja, tetapi contoh ini menunjukkan bagaimana untuk memperluaskan pertanyaan XPath untuk menjadikannya lebih kompleks. Kaedah objek tidak boleh dipanggil dalam XPath. Sekiranya anda mendapati bahawa anda perlu mengakses sifat atau kaedah objek tertentu untuk menyelesaikan pertanyaan XPath, penyelesaian terbaik adalah menggunakan XPath untuk melengkapkan bahagian yang boleh anda lakukan, dan kemudian gunakan sebarang kaedah objek atau atribut untuk memproses compare()
yang dijana seperti yang diperlukan .
<?php public function getNumberOfBooksByAuthor($author) { $query = "count(//library/book/author[text() = '$author']/..)"; $xpath = new DOMXPath($this->domDocument); return $xpath->evaluate($query); } ?>
Ringkasan DOMNodeList
XPath adalah cara terbaik untuk mengurangkan jumlah kod yang ditulis dan mempercepat pelaksanaan kod semasa memproses data XML. Walaupun bukan sebahagian daripada spesifikasi DOM rasmi, ciri tambahan yang disediakan oleh PHP DOM membolehkan anda memperluaskan fungsi XPath standard dengan fungsi tersuai. Ini adalah ciri yang sangat kuat, dan apabila anda menjadi lebih akrab dengan fungsi XPath, anda mungkin mendapati diri anda kurang bergantung kepadanya. (gambar dari fotolia) Soalan Lazim (FAQ) Mengenai PHP DOM dengan XPath XPath (XML Path Language) adalah bahasa pertanyaan yang digunakan untuk memilih nod dari dokumen XML. Dalam php dom, XPath digunakan untuk melintasi unsur -unsur dan sifat dalam dokumen XML. Ia membolehkan anda mencari dan memilih bahagian tertentu dokumen XML dalam pelbagai cara, seperti memilih nod dengan nama, memilih nod dengan nilai atributnya, atau memilih nod oleh lokasinya dalam dokumen. Ini menjadikannya alat yang berkuasa untuk parsing dan memanipulasi data XML dalam PHP. Untuk membuat contoh DOMXPath, anda perlu membuat contoh kelas Domdocument. Sebaik sahaja anda telah memperoleh objek domdocument, anda boleh membuat objek DOMXPath baru dengan lulus objek domdokumen ke pembina DOMXPath. Berikut adalah contoh: anda boleh memilih nod menggunakan kaedah yang merupakan elemen kanak -kanak dari elemen dan . Kaedah ini mempunyai dua parameter: awalan dan ruang nama URI. Selepas mendaftarkan ruang nama, anda boleh menggunakan awalan dalam pertanyaan XPath anda. Contohnya: elemen seperti yang ditunjukkan di bawah: Ya, anda boleh menggunakan XPath dengan dokumen HTML dalam PHP DOM. Walau bagaimanapun, kerana HTML tidak selalu dibentuk dengan baik XML, anda mungkin menghadapi masalah untuk menggunakan XPath dengan HTML. Untuk mengelakkan masalah ini, anda boleh menggunakan kaedah Apabila menggunakan XPath dalam php dom, kesilapan mungkin berlaku untuk beberapa sebab, seperti format ekspresi XPath yang salah atau dokumen XML tidak boleh dimuatkan. Untuk mengendalikan kesilapan ini, anda boleh mengaktifkan pengendalian ralat pengguna menggunakan fungsi Walaupun XPath sendiri tidak menyediakan cara untuk mengubahsuai dokumen XML, anda boleh menggunakan XPath dengan DOM API untuk mengubahsuai dokumen XML. Anda boleh menggunakan XPath untuk memilih nod yang anda ingin ubah, dan kemudian gunakan kaedah yang disediakan oleh DOM API untuk diubah suai. Sebagai contoh, anda boleh menggunakan kaedah Atas ialah kandungan terperinci PHP Dom: Menggunakan XPath. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP! Apa itu XPath dan bagaimana ia berfungsi dalam php dom?
Bagaimana untuk membuat contoh DOMXPath?
<!DOCTYPE library [
<!ELEMENT library (book*)>
<!ELEMENT book (title, author, genre, chapter*)>
<!ATTLIST book isbn ID #REQUIRED>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT genre (#PCDATA)>
<!ELEMENT chapter (chaptitle,text)>
<!ATTLIST chapter position NMTOKEN #REQUIRED>
<!ELEMENT chaptitle (#PCDATA)>
<!ELEMENT text (#PCDATA)>
]>
Bagaimana menggunakan XPath untuk memilih nod?
query()
objek DOMXPath. Kaedah query()
mengambil ekspresi XPath sebagai parameter dan mengembalikan objek domnodel yang mengandungi semua nod yang sepadan dengan ungkapan. Contohnya: <?xml version="1.0" encoding="utf-8"?>
<library>
<book isbn="isbn1234">
<title>A Book</title>
<author>An Author</author>
<genre>Horror</genre>
<chapter position="first">
<chaptitle>chapter one</chaptitle>
<text></text>
</chapter>
</book>
<book isbn="isbn1235">
<title>Another Book</title>
<author>Another Author</author>
<genre>Science Fiction</genre>
<chapter position="first">
<chaptitle>chapter one</chaptitle>
<text>Sit Dolor Amet...</text>
</chapter>
</book>
</library>
<book>
. <title>
Apakah perbezaan antara kaedah dalam
query()
DOMXPath? evaluate()
Kedua -dua kaedah query()
digunakan untuk menilai ekspresi XPath. Perbezaannya adalah jenis hasil yang mereka kembali. Kaedah evaluate()
mengembalikan domnodelist semua nod yang sepadan dengan ekspresi XPath. Sebaliknya, query()
mengembalikan hasil yang ditaip, seperti boolean, nombor, atau rentetan, bergantung kepada ekspresi XPath. Jika hasil ekspresi adalah set nod, evaluate()
akan mengembalikan domnodel. evaluate()
Untuk mengendalikan ruang nama dalam pertanyaan XPath, anda perlu mendaftarkan ruang nama dengan objek DOMXPath menggunakan kaedah registerNamespace()
//library/book
anda boleh menggunakan simbol
diikuti oleh nama harta untuk memilih sifat di XPath. Sebagai contoh, untuk memilih semua sifat @
, anda boleh menggunakan ekspresi XPath berikut: <a></a>
. href
//a/@href
Bagaimana menggunakan fungsi XPath dalam php dom? XPath menyediakan banyak fungsi yang boleh digunakan dalam ekspresi XPath. Fungsi ini boleh digunakan untuk memanipulasi rentetan, nombor, set nod, dan banyak lagi. Untuk menggunakan fungsi XPath dalam php dom, sertakan fungsi dalam ekspresi XPath. Sebagai contoh, untuk memilih semua elemen
dengan elemen harga dengan nilai yang lebih besar daripada 30, anda boleh menggunakan fungsi <book>
. number()
Bolehkah saya menggunakan XPath dengan dokumen HTML dalam php dom?
loadHTML()
kelas domdokumen untuk memuatkan dokumen HTML. Kaedah ini mengutip HTML dan membetulkan sebarang kesilapan pemformatan, yang membolehkan anda menggunakan XPath dengan objek domdokumen yang dihasilkan. Bagaimana menangani kesilapan apabila menggunakan XPath dalam php dom?
libxml_use_internal_errors()
. Fungsi ini akan menyebabkan kesilapan libxml disimpan secara dalaman, membolehkan anda memprosesnya dalam kod anda. Anda kemudian boleh menggunakan fungsi libxml_get_errors()
untuk mendapatkan kesilapan dan memprosesnya seperti yang diperlukan. Bolehkah saya mengubahsuai dokumen XML menggunakan XPath dalam php dom?
removeChild()
kelas domnode untuk memadam nod, atau menggunakan kaedah setAttribute()
kelas domelement untuk mengubah nilai atribut.