Συντομευμένη σύνταξη XPath. Παραδείγματα ερωτημάτων xpath σε html Χρησιμοποιώντας τον ακόλουθο άξονα

Το XPath χρησιμοποιείται για την πλοήγηση στα στοιχεία και τα χαρακτηριστικά ενός εγγράφου XML. Το XPath είναι ένα από τα βασικά στοιχεία του προτύπου W3C XSLT.

1 Τι συνέβη XPath

Εκφράσεις XPath

Το XPath χρησιμοποιεί εκφράσεις διαδρομής για να επιλέξει μεμονωμένους κόμβους ή ένα σύνολο κόμβων σε ένα έγγραφο XML. Αυτές οι εκφράσεις είναι πολύ παρόμοιες με τις εκφράσεις που βλέπετε όταν εργάζεστε με ένα παραδοσιακό σύστημα αρχείων υπολογιστή.

Τυπικές λειτουργίες XPath

Το XPath περιλαμβάνει περισσότερες από 100 ενσωματωμένες λειτουργίες. Υπάρχουν συναρτήσεις για τιμές συμβολοσειράς και αριθμητικές τιμές, ημερομηνία και ώρα, σύγκριση κόμβων και χειρισμό QName, διαχείριση ακολουθιών, τιμές boolean και πολλά άλλα.

Το XPath χρησιμοποιείται στο XSLT

Το XPath είναι ένα από τα βασικά στοιχεία του προτύπου XSLT. Χωρίς γνώση του XPath, δεν θα μπορείτε να δημιουργήσετε έγγραφα XSLT.

2 Ορολογία XPath

Κόμβοι

Υπάρχουν επτά τύποι κόμβων στο XPath: στοιχείο, χαρακτηριστικό, κείμενο, χώρος ονομάτων, οδηγίες επεξεργασίας, σχόλια και κόμβοι εγγράφων. Τα έγγραφα XML επεξεργάζονται ως δέντρα κόμβων. Το επάνω στοιχείο του δέντρου ονομάζεται ριζικό στοιχείο. Κοιτάξτε το ακόλουθο έγγραφο XML:

Χάρρυ Πόττερ J. K. Rowling 2005 29.99

Παραδείγματα κόμβων στο παραπάνω έγγραφο XML:

(στοιχείο ρίζας) J. K. Rowling (κόμβος) lang = "en"(Χαρακτηριστικό)

Ατομικές τιμές

Οι ατομικές τιμές είναι κόμβοι που δεν έχουν παιδιά ή γονείς. Παράδειγμα ατομικών τιμών:

J. K. Rowling "en"

Στοιχεία

Τα στοιχεία είναι ατομικές τιμές ή κόμβοι.

3 Σχέσηκόμβους

Μητρική εταιρεία

Κάθε στοιχείο και χαρακτηριστικό έχει έναν γονέα. Στο παρακάτω παράδειγμα, το στοιχείο βιβλίου είναι το γονικό στοιχείο του τίτλου, του συγγραφέα, του έτους και της τιμής:

Χάρρυ Πόττερ J K Rowling 2005 29.99

Απόγονοι

Οι κόμβοι στοιχείων μπορεί να έχουν μηδέν, ένα ή περισσότερα παιδιά. Στο ακόλουθο παράδειγμα, τα στοιχεία "τίτλος", "συγγραφέας", "έτος" και "τιμή" είναι όλα παιδιά του στοιχείου του βιβλίου:

Χάρρυ Πόττερ J K Rowling 2005 29.99

Στοιχεία του ίδιου επιπέδου

Αυτοί είναι κόμβοι που έχουν τον ίδιο γονέα. Στο ακόλουθο παράδειγμα, τα στοιχεία "τίτλος", "συγγραφέας", "έτος" και "τιμή" είναι όλα στοιχεία του ίδιου επιπέδου:

Χάρρυ Πόττερ J K Rowling 2005 29.99

Προγόνους

Γονέας του κόμβου, γονέας του γονέα του κόμβου κ.λπ. Στο παρακάτω παράδειγμα, οι πρόγονοι του στοιχείου τίτλου είναι τα στοιχεία του βιβλίου και του βιβλιοπωλείου:

Χάρρυ Πόττερ J K Rowling 2005 29.99

Απόγονοι

Τα παιδιά ενός κόμβου, τα παιδιά ενός κόμβου κ.λπ. Στο παρακάτω παράδειγμα, τα παιδιά του στοιχείου "βιβλιοπωλείο" είναι τα στοιχεία "βιβλίο", "τίτλος", "συγγραφέας", "έτος" και "τιμή":

Χάρρυ Πόττερ J K Rowling 2005 29.99

4 Σύνταξη XPath

Το XPath χρησιμοποιεί εκφράσεις διαδρομής για να επιλέξει κόμβους ή σύνολα κόμβων σε ένα έγγραφο XML. Ένας κόμβος μπορεί να επιλεγεί ακολουθώντας μια διαδρομή ή με βήματα. Θα χρησιμοποιήσουμε το ακόλουθο έγγραφο XML στα παρακάτω παραδείγματα.

Χάρρυ Πόττερ 29.99 Εκμάθηση XML 39.95

Επιλογή κόμβου

Χρησιμοποιώντας εκφράσεις XPath για να επιλέξετε κόμβους σε ένα έγγραφο XML, μπορείτε να επιλέξετε έναν κόμβο ακολουθώντας μια διαδρομή ή βήματα. Οι πιο χρήσιμες εκφράσεις διαδρομής παρατίθενται παρακάτω:

Ο παρακάτω πίνακας παραθέτει ορισμένες διαδρομές έκφρασης και το αποτέλεσμα της εκτέλεσης της παράστασης:

Έκφραση XPath Αποτέλεσμα
βιβλιοπωλείο Επιλέγει όλους τους κόμβους με το όνομα "βιβλιοπωλείο"
/βιβλιοπωλείο Επιλέγει το ριζικό στοιχείο του βιβλιοπωλείου

Σημείωση:Εάν μια διαδρομή ξεκινά με κάθετο (/), είναι πάντα μια απόλυτη διαδρομή προς το στοιχείο!

βιβλιοπωλείο/βιβλίο Επιλέγει όλα τα στοιχεία "βιβλίο" που είναι παιδιά του στοιχείου "βιβλιοπωλείο".
//Βιβλίο Επιλέγει όλα τα στοιχεία "βιβλίου" ανεξάρτητα από το πού βρίσκονται στο έγγραφο
βιβλιοπωλείο//βιβλίο Επιλέγει όλα τα στοιχεία "βιβλίο" που είναι παιδιά του στοιχείου "βιβλιοπωλείο", ανεξάρτητα από το πού βρίσκονται κάτω από το στοιχείο "βιβλιοπωλείο"
//@lang Επιλέγει όλα τα χαρακτηριστικά που ονομάζονται "lang"

Κατηγορήματα

Τα κατηγορήματα χρησιμοποιούνται για την εύρεση ενός συγκεκριμένου κόμβου ή ενός κόμβου που περιέχει μια συγκεκριμένη τιμή. Τα κατηγορήματα περιβάλλονται πάντα από αγκύλες. Ο παρακάτω πίνακας παραθέτει ορισμένες εκφράσεις διαδρομής με κατηγορήματα και το αποτέλεσμα της έκφρασης:

Εκφράσεις XPath Αποτέλεσμα
/βιβλιοπωλείο/βιβλίο Επιλέγει το πρώτο στοιχείο "βιβλίο", το οποίο είναι θυγατρικό του στοιχείου "βιβλιοπωλείο".

Σημείωση:Στο IE 5,6,7,8,9, ο πρώτος κόμβος έχει δείκτη , αλλά σύμφωνα με τις οδηγίες του W3C, είναι . Για να λύσετε αυτό το πρόβλημα στον IE, ορίστε την επιλογή "SelectionLanguage" για το XPath:

Σε JavaScript: xml.setProperty("SelectionLanguage", "XPath");
/βιβλιοπωλείο/βιβλίο Επιλέγει το τελευταίο στοιχείο "βιβλίο" που είναι θυγατρικό του στοιχείου "βιβλιοπωλείο".
/βιβλιοπωλείο/βιβλίο Επιλέγει το προτελευταίο στοιχείο "βιβλίο", το οποίο είναι θυγατρικό του στοιχείου "βιβλιοπωλείο".
/βιβλιοπωλείο/βιβλίο Επιλέγοντας τα δύο πρώτα στοιχεία «βιβλίο» που είναι παιδιά του στοιχείου «βιβλιοπωλείο».
//τίτλος[@lang] Επιλέγει όλα τα στοιχεία "τίτλος" που έχουν ένα χαρακτηριστικό με το όνομα "lang"
//title[@lang="en"] Επιλέγει όλα τα στοιχεία "τίτλος" που έχουν χαρακτηριστικό "language" με τιμή "en"
/βιβλιοπωλείο/βιβλίο Επιλέγει όλα τα στοιχεία "βιβλίο" μετά το στοιχείο "βιβλιοπωλείο" που έχουν στοιχείο "τιμή" με τιμή μεγαλύτερη από 35,00
/βιβλιοπωλείο/βιβλίο/τίτλος Επιλέγει όλα τα στοιχεία "τίτλος" βιβλίου του στοιχείου "βιβλιοπωλείο" που έχουν στοιχείο "τιμή" με τιμή μεγαλύτερη από 35,00

Επιλογή άγνωστων κόμβων

Οι ειδικοί χαρακτήρες XPath μπορούν να χρησιμοποιηθούν για την επιλογή άγνωστων κόμβων XML.

Στον παρακάτω πίνακα, έχουμε παραθέσει ορισμένες διαδρομές έκφρασης και αποτελέσματα έκφρασης:

Επιλογή πολλαπλών μονοπατιών

Χρήση του χειριστή | στις εκφράσεις XPath μπορείτε να επιλέξετε πολλαπλές διαδρομές. Ο παρακάτω πίνακας παραθέτει πολλές εκφράσεις διαδρομής και τα αποτελέσματά τους:

5 Άξονες XPath

Θα χρησιμοποιήσουμε το ακόλουθο έγγραφο XML αργότερα στο παράδειγμα.

Χάρρυ Πόττερ 29.99 Εκμάθηση XML 39.95

Οι άξονες ορίζουν σύνολα κόμβων, σε σχέση με τον τρέχοντα κόμβο.

Όνομα άξονα Αποτέλεσμα
πρόγονος Επιλέγει όλους τους προγόνους (γονείς, παππούδες, γιαγιάδες κ.λπ.) του τρέχοντος κόμβου
πρόγονος-ή-εαυτός Επιλέγει όλους τους προγόνους (γονείς, παππούδες, κ.λπ.) του τρέχοντος κόμβου και του ίδιου του τρέχοντος κόμβου
Χαρακτηριστικό
παιδί
απόγονος Επιλέγει όλα τα παιδιά (παιδιά, εγγόνια κ.λπ.) του τρέχοντος κόμβου
απόγονος-ή-εαυτός Επιλέγει όλα τα παιδιά (παιδιά, εγγόνια κ.λπ.) του τρέχοντος κόμβου και του ίδιου του τρέχοντος κόμβου
ΕΠΟΜΕΝΟ Επιλέγει τα πάντα στο έγγραφο αφού κλείσει η ετικέτα του τρέχοντος κόμβου
ακόλουθος-αδερφάκι Επιλέγει όλους τους κόμβους του ίδιου επιπέδου μετά τον τρέχοντα κόμβο
χώρο ονομάτων Επιλέγει όλους τους κόμβους στον δεδομένο χώρο ονομάτων του τρέχοντος κόμβου
μητρική εταιρεία Επιλέγει τον γονέα του τρέχοντος κόμβου
προηγούμενος Επιλέγει όλους τους κόμβους που εμφανίζονται πριν από τον τρέχοντα κόμβο στο έγγραφο, εξαιρουμένων των προγόνων, των κόμβων χαρακτηριστικών και των κόμβων χώρου ονομάτων
προηγούμενος-αδερφός Επιλέγει όλα τα αδέρφια μέχρι τον τρέχοντα κόμβο
εαυτός Επιλέγει τον τρέχοντα κόμβο

6 Εκφράσειςμονοπάτια δειγματοληψίας

Η διαδρομή τοποθεσίας μπορεί να είναι απόλυτη ή σχετική. Μια διαδρομή απόλυτης τοποθεσίας ξεκινά με κάθετο (/), αλλά μια σχετική διαδρομή όχι. Και στις δύο περιπτώσεις, η διαδρομή δειγματοληψίας αποτελείται από ένα ή περισσότερα βήματα που χωρίζονται με κάθετες:

Απόλυτη διαδρομή τοποθεσίας:

/βήμα/βήμα/...

Διαδρομή ανάκτησης σχετικής τοποθεσίας:

Βήμα/βήμα/...

Κάθε βήμα αξιολογείται σε σχέση με τους κόμβους στο τρέχον σύνολο κόμβων. Το βήμα αποτελείται από:

  • άξονας (καθορίζει τη σχέση δέντρου μεταξύ των επιλεγμένων κόμβων και του τρέχοντος κόμβου).
  • έλεγχος κόμβου (προσδιορίζει έναν κόμβο εντός ενός άξονα).
  • μηδέν ή περισσότερα κατηγορήματα (για να βελτιώσετε περαιτέρω το επιλεγμένο σύνολο κόμβων)

Η σύνταξη του βήματος ανάκτησης είναι:

Όνομα άξονα::nodetestΌνομα άξονα::nodetest[πρόβλεψη]

Παράδειγμα Αποτέλεσμα
παιδί::βιβλίο Επιλέγει όλους τους κόμβους βιβλίων που είναι παιδιά του τρέχοντος κόμβου
χαρακτηριστικό::lang Επιλέγει το χαρακτηριστικό γλώσσας (lang) του τρέχοντος κόμβου
παιδί::* Επιλέγει όλα τα παιδιά του τρέχοντος κόμβου
Χαρακτηριστικό::* Επιλέγει όλα τα χαρακτηριστικά του τρέχοντος κόμβου
παιδί::text() Επιλέγει όλους τους κόμβους κειμένου του τρέχοντος κόμβου
παιδί::node() Επιλέγει όλα τα άμεσα παιδιά του τρέχοντος κόμβου
απόγονος::βιβλίο Επιλέγει όλα τα παιδιά του τρέχοντος κόμβου
πρόγονος::βιβλίο Επιλέγει όλους τους προγόνους των "βιβλίων" του τρέχοντος κόμβου
ancestor-or-self::βιβλίο Επιλέγει όλους τους προγόνους βιβλίων του τρέχοντος κόμβου - και τον τρέχοντα κόμβο εάν είναι επίσης βιβλίο
παιδί::*/παιδί::τιμή Επιλέγει όλα τα παιδιά της "τιμής" ένα επίπεδο μακριά από τον τρέχοντα κόμβο

7 χειριστές XPath

Οι εκφράσεις XPath επιστρέφουν ως ένα σύνολο κόμβων, συμβολοσειρών, δυαδικών τιμών ή αριθμητικών τιμών. Παρακάτω είναι μια λίστα τελεστών που χρησιμοποιούνται στις εκφράσεις XPath:

Χειριστής Περιγραφή Παράδειγμα
| Υπολογίζει δύο σύνολα κόμβων //βιβλίο | //CD
+ Πρόσθεση 6 + 4
- Αφαίρεση 6 - 4
* Πολλαπλασιασμός 6 * 4
div Διαίρεση 8 div 4
= Ισότητα τιμή=9,80
!= Ανισότητα τιμή!=9,80
< Λιγότερο από τιμή<9.80
<= Λιγότερο ή ίσο τιμή≤9,80
> Περισσότερο από τιμή>9,80
>= Περισσότερο ή ίσο τιμή≤9,80
ή Ή τιμή=9,80 ή τιμή=9,70
και ΚΑΙ τιμή>9,00 και τιμή<9.90
mod Υπόλοιπο της διαίρεσης 5 mod 2

8 Παραδείγματα XPath

Ας δούμε τη βασική σύνταξη XPath με μερικά παραδείγματα. Θα χρησιμοποιήσουμε το ακόλουθο έγγραφο XML "books.xml" στα παρακάτω παραδείγματα:

Καθημερινά ιταλικά Giada De Laurentiis 2005 30.00 Χάρρυ Πόττερ J K Rowling 2005 29.99 XQuery Kick Start Τζέιμς ΜακΓκόβερν Per Bothner Kurt Cagle Τζέιμς Λιν Vaidyanathan Nagarajan 2003 49.99 Εκμάθηση XML Erik T. Ray 2003 39.95

Φόρτωση εγγράφου XML

Χρησιμοποιήστε το XMLHttpRequest για λήψη εγγράφων XML, το οποίο υποστηρίζεται από τα περισσότερα σύγχρονα προγράμματα περιήγησης:

Var xmlhttp=new XMLHttpRequest()

Κώδικας για προγράμματα περιήγησης Microsoft παλαιού τύπου (IE 5 και 6):

Var xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")

Επιλογή κόμβου

Δυστυχώς, το XPath μπορεί να λειτουργεί διαφορετικά στον Internet Explorer από ό,τι σε άλλα προγράμματα περιήγησης. Στα παραδείγματά μας θα χρησιμοποιήσουμε κώδικα που θα πρέπει να λειτουργεί στα περισσότερα προγράμματα περιήγησης. Ο Internet Explorer χρησιμοποιεί τη μέθοδο "selectNodes()" για να επιλέξει κόμβους σε ένα έγγραφο XML:

XmlDoc.selectNodes(xpath);

Οι Firefox, Chrome, Opera και Safari χρησιμοποιούν τη μέθοδο αξιολόγησης() για να επιλέξουν κόμβους από ένα έγγραφο XML:

XmlDoc.evaluate(xpath, xmlDoc, null, XPathResult.ANY_TYPE, null);

Επιλέξτε όλους τους τίτλους

Το ακόλουθο παράδειγμα επιλέγει όλους τους κόμβους κεφαλίδας:

/βιβλιοπωλείο/βιβλίο/τίτλος

Επιλέγοντας τον τίτλο του πρώτου βιβλίου

Το ακόλουθο παράδειγμα επιλέγει τον τίτλο του πρώτου κόμβου "βιβλίο" μετά το στοιχείο "βιβλιοπωλείο":

/βιβλιοπωλείο/βιβλίο/τίτλος

Επιλέξτε όλες τις τιμές

Το ακόλουθο παράδειγμα επιλέγει το κείμενο όλων των κόμβων τιμών:

/βιβλιοπωλείο/βιβλίο/τιμή

Επιλέγει κόμβους με τιμή >35

Το ακόλουθο παράδειγμα επιλέγει όλους τους κόμβους με τιμές πάνω από 35:

/βιβλιοπωλείο/βιβλίο/τιμή

Επιλογή κόμβων κεφαλίδας με τιμή >35

Το ακόλουθο παράδειγμα επιλέγει όλους τους κόμβους τίτλου με τιμή μεγαλύτερη από 35:

/βιβλιοπωλείο/βιβλίο/τίτλος

Η Xpath είναι μια γλώσσα ερωτημάτων για στοιχεία εγγράφου xml ή xhtml. Ακριβώς όπως η SQL, η xpath είναι μια δηλωτική γλώσσα ερωτημάτων. Για να αποκτήσετε τα δεδομένα που σας ενδιαφέρουν, πρέπει απλώς να δημιουργήσετε ένα ερώτημα που να περιγράφει αυτά τα δεδομένα. Ο διερμηνέας γλώσσας xpath θα κάνει όλη τη βρώμικη δουλειά για εσάς.
Πολύ βολικό, έτσι δεν είναι; Ας δούμε ποιες δυνατότητες προσφέρει το xpath για πρόσβαση σε κόμβους ιστοσελίδων.

Δημιουργία αιτήματος σε κόμβους ιστοσελίδων

Φέρνω στην προσοχή σας μια μικρή εργαστηριακή εργασία, κατά την οποία θα δείξω τη δημιουργία αιτημάτων xpath σε μια ιστοσελίδα. Θα μπορείτε να επαναλάβετε τα αιτήματα που έδωσα και, το πιο σημαντικό, να προσπαθήσετε να εκπληρώσετε τα δικά σας. Ελπίζω ότι χάρη σε αυτό, το άρθρο θα είναι εξίσου ενδιαφέρον για αρχάριους και προγραμματιστές που είναι εξοικειωμένοι με το xpath to xml.

Για το εργαστήριο θα χρειαστούμε:
- ιστοσελίδα xhtml.
- Πρόγραμμα περιήγησης Mozilla Firefox με πρόσθετα.
- firebug?
- FirePath ;
(μπορείτε να χρησιμοποιήσετε οποιοδήποτε άλλο πρόγραμμα περιήγησης με υποστήριξη οπτικού xpath)
- λίγο χρόνο.

Ως ιστοσελίδα για τη διεξαγωγή ενός πειράματος, προτείνω την κύρια σελίδα του ιστότοπου του World Wide Web Consortium ("http://w3.org"). Είναι αυτός ο οργανισμός που αναπτύσσει τις γλώσσες xquery(xpath), τις προδιαγραφές xhtml και πολλά άλλα πρότυπα Διαδικτύου.

Εργο
Ανακτήστε πληροφορίες σχετικά με συνέδρια κοινοπραξίας από τον κώδικα xhtml της κύριας σελίδας w3.org χρησιμοποιώντας ερωτήματα xpath.
Ας αρχίσουμε να γράφουμε ερωτήματα xpath.
Πρώτο αίτημα Xpath
Ανοίξτε την καρτέλα Firepath στο FireBug, επιλέξτε το στοιχείο που θα αναλυθεί με τον επιλογέα, κάντε κλικ στο: Το Firepath δημιούργησε ένα αίτημα xpath για το επιλεγμένο στοιχείο.

Εάν επιλέξατε τον τίτλο του πρώτου συμβάντος, τότε το αίτημα θα είναι ως εξής:

Αφού αφαιρέσετε τα περιττά ευρετήρια, το ερώτημα θα ταιριάζει με όλα τα στοιχεία του τύπου κεφαλίδας.

Το Firepath επισημαίνει στοιχεία που ταιριάζουν με το ερώτημα. Μπορείτε να δείτε σε πραγματικό χρόνο ποιοι κόμβοι εγγράφων αντιστοιχούν στο ερώτημα.

Αίτημα για πληροφορίες σχετικά με τους χώρους του συνεδρίου:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

Έτσι παίρνουμε μια λίστα χορηγών:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

σύνταξη xpath

Ας επιστρέψουμε στα ερωτήματα που δημιουργήσαμε και ας κατανοήσουμε πώς είναι δομημένα.
Ας εξετάσουμε λεπτομερώς το πρώτο αίτημα

Σε αυτό το ερώτημα έχω χωρίσει τρία μέρη για να δείξω τις δυνατότητες του xpath. (Η διαίρεση σε μέρη είναι δύσκολη)

Πρώτο μέρος
.// - αναδρομική κάθοδος σε μηδενικά ή περισσότερα επίπεδα ιεραρχίας από το τρέχον πλαίσιο. Στην περίπτωσή μας, το τρέχον πλαίσιο είναι η ρίζα του εγγράφου

Δεύτερο μέρος
* - οποιοδήποτε στοιχείο,
[@id="w3c_home_upcoming_events"]– ένα κατηγόρημα βάσει του οποίου αναζητούμε έναν κόμβο που έχει χαρακτηριστικό id ίσο με «w3c_home_upcoming_events». Τα αναγνωριστικά στοιχείων XHTML πρέπει να είναι μοναδικά. Επομένως, το ερώτημα "οποιοδήποτε στοιχείο με συγκεκριμένο αναγνωριστικό" θα πρέπει να επιστρέψει τον μόνο κόμβο που αναζητούμε.

Μπορούμε να αντικαταστήσουμε * στο ακριβές όνομα του κόμβου divσε αυτό το αίτημα
div[@id="w3c_home_upcoming_events"]

Έτσι, κατεβαίνουμε το δέντρο εγγράφων στον κόμβο div[@id="w3c_home_upcoming_events"] που χρειαζόμαστε. Δεν μας ενδιαφέρει καθόλου από ποιους κόμβους αποτελείται το δέντρο DOM και πόσα επίπεδα ιεραρχίας παραμένουν παραπάνω.

Το τρίτο μέρος
/ul/li/div/p/a–xpath είναι η διαδρομή προς ένα συγκεκριμένο στοιχείο. Η διαδρομή αποτελείται από βήματα διευθυνσιοδότησης και συνθήκες ελέγχου κόμβων (ul, li, κ.λπ.). Τα βήματα διαχωρίζονται με έναν χαρακτήρα "/" (κάθετο).

xpath συλλογές
Δεν είναι πάντα δυνατή η πρόσβαση στον κόμβο ενδιαφέροντος χρησιμοποιώντας ένα κατηγόρημα ή βήματα διεύθυνσης. Πολύ συχνά υπάρχουν πολλοί κόμβοι του ίδιου τύπου σε ένα επίπεδο ιεραρχίας και είναι απαραίτητο να επιλέξετε «μόνο τον πρώτο» ή «μόνο τον δεύτερο» κόμβους. Παρέχονται συλλογές για τέτοιες περιπτώσεις.

Οι συλλογές xpath σάς επιτρέπουν να έχετε πρόσβαση σε ένα στοιχείο από το ευρετήριό του. Τα ευρετήρια αντιστοιχούν στη σειρά με την οποία παρουσιάστηκαν τα στοιχεία στο αρχικό έγγραφο. Ο σειριακός αριθμός στις συλλογές υπολογίζεται από ένα.

Με βάση το γεγονός ότι ο "τόπος" είναι πάντα η δεύτερη παράγραφος μετά το "όνομα συνεδρίου", λαμβάνουμε το ακόλουθο ερώτημα:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
Όπου p είναι το δεύτερο στοιχείο στο σύνολο για κάθε κόμβο στη λίστα /ul/li/div.

Ομοίως, μπορούμε να λάβουμε μια λίστα χορηγών με το αίτημα:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

Μερικές συναρτήσεις xpath
Υπάρχουν πολλές λειτουργίες στο xpath για εργασία με στοιχεία μέσα σε μια συλλογή. Θα δώσω μόνο μερικά από αυτά.

τελευταίος():
Επιστρέφει το τελευταίο στοιχείο της συλλογής.
Ερώτημα ul/li/div/p - θα επιστρέψει τις τελευταίες παραγράφους για κάθε κόμβο λίστας "ul".
Η συνάρτηση first() δεν παρέχεται. Για πρόσβαση στο πρώτο στοιχείο, χρησιμοποιήστε το ευρετήριο "1".

κείμενο():
Επιστρέφει το περιεχόμενο δοκιμής ενός στοιχείου.
.//a – λαμβάνουμε όλους τους συνδέσμους με το κείμενο "Αρχείο".

position() και mod:
position() - επιστρέφει τη θέση ενός στοιχείου σε ένα σύνολο.
mod είναι το υπόλοιπο της διαίρεσης.

Συνδυάζοντας αυτές τις λειτουργίες μπορούμε να πάρουμε:
- ούτε καν στοιχεία ul/li
- άρτια στοιχεία: ul/li

Λειτουργίες σύγκρισης

  • < - логическое «меньше»
  • > - λογικό "μεγαλύτερο από"
  • <= - логическое «меньше либо равно»
  • >= - λογικό "μεγαλύτερο ή ίσο"
ul/li , ul/li - λίστα στοιχείων ξεκινώντας από τον 3ο αριθμό και αντίστροφα.

Από μόνος του

Προσπάθησε να πάρεις:
- ακόμη και συνδέσμους URL από το αριστερό μενού "Standards".
- κεφαλίδες όλων των ειδήσεων, εκτός από την πρώτη από την κεντρική σελίδα του w3c.org.

Xpath στην PHP5

$dom = νέο DomDocument(); $dom->loadHTML($HTMLCode); $xpath = νέο DomXPath($dom); $_res = $xpath->query(".//*[@id="w3c_home_upcoming_events"]/ul/li/div/p/a"); foreach($_res => $obj) ( echo "URL: ".$obj->getAttribute("href"); echo $obj->nodeValue; )

Τελικά

Χρησιμοποιώντας ένα απλό παράδειγμα, είδαμε τις δυνατότητες του xpath για πρόσβαση σε κόμβους ιστοσελίδων.
Το Xpath είναι το βιομηχανικό πρότυπο για την πρόσβαση σε στοιχεία xml και μετασχηματισμούς xhtml, xslt.
Μπορείτε να το χρησιμοποιήσετε για να αναλύσετε οποιαδήποτε σελίδα html. Εάν ο πηγαίος κώδικας html περιέχει σημαντικά σφάλματα στη σήμανση, εκτελέστε τον

Σήμερα θα ρίξουμε μια πιο προσεκτική ματιά στο θέμα της χρήσης του XPath με την PHP. Θα δείτε στα παραδείγματα πώς το XPath μειώνει σημαντικά την ποσότητα του κώδικα. Ας δούμε τη χρήση ερωτημάτων και συναρτήσεων στο XPath.

Στην αρχή, θα σας δώσω δύο τύπους εγγράφων: DTD και XML, χρησιμοποιώντας τα οποία θα εξετάσουμε τη λειτουργία του PHP DOM XPath. Δείτε πώς μοιάζουν:

Ενα βιβλίο Ένας Συγγραφέας Φρίκη κεφάλαιο ένα Ένα άλλο βιβλίο Ένας άλλος συγγραφέας Επιστημονική φαντασία κεφάλαιο ένα

Βασικά ερωτήματα XPath

Η απλή σύνταξη XPath σάς επιτρέπει να έχετε πρόσβαση σε στοιχεία σε ένα έγγραφο XML. Με τον απλούστερο τρόπο, μπορείτε να καθορίσετε τη διαδρομή προς το επιθυμητό στοιχείο. Χρησιμοποιώντας το έγγραφο XML που παρέχεται παραπάνω, το ακόλουθο ερώτημα XPath θα επιστρέψει τη συλλογή των τρεχόντων στοιχείων που βρίσκονται στο στοιχείο βιβλίου:

//βιβλιοθήκη/βιβλίο

Σαν αυτό! Δύο κάθετες προς τα εμπρός ορίζουν το ριζικό στοιχείο του εγγράφου και μία κάθετο προς τα εμπρός μεταβαίνει στο θυγατρικό στοιχείο του βιβλίου. Είναι απλό και γρήγορο, έτσι δεν είναι;

Τι γίνεται όμως αν θέλετε να επιλέξετε ένα συγκεκριμένο στοιχείο βιβλίου από ένα σύνολο; Ας υποθέσουμε ότι θέλετε βιβλία από έναν «Κάποιο Συγγραφέα». Το ερώτημα XPath για αυτό θα ήταν:

//βιβλιοθήκη/βιβλίο/συγγραφέας/..

μπορείς να χρησιμοποιήσεις κείμενο()σε αγκύλες για να συγκρίνετε την τιμή του κόμβου. Επίσης «/..» σημαίνει ότι θέλουμε να χρησιμοποιήσουμε το γονικό στοιχείο (δηλαδή να επιστρέψουμε έναν κόμβο παραπάνω).

Τα ερωτήματα XPath γίνονται χρησιμοποιώντας μία ή δύο συναρτήσεις: ερώτηση()Και αξιολογώ(). Και οι δύο σχηματίζουν ένα αίτημα, αλλά η διαφορά είναι στο αποτέλεσμα που επιστρέφεται. Η ερώτηση () θα επιστρέφει πάντα DOMNodeList, Σε αντίθεση με αξιολογώ()θα επιστρέψει ένα αποτέλεσμα κειμένου εάν είναι δυνατόν. Για παράδειγμα, εάν το ερώτημά σας XPath θα επέστρεφε τον αριθμό των βιβλίων που γράφτηκαν από έναν συγκεκριμένο συγγραφέα, τότε το query() θα επέστρεφε ένα κενό DOMNodeList, το value() θα επέστρεφε απλώς έναν αριθμό, μπορείτε να το χρησιμοποιήσετε απευθείας για να ανακτήσετε τα δεδομένα από τον κόμβο .

Κωδικός XPath και Οφέλη ταχύτητας

Ας δούμε ένα απλό παράδειγμα που θα επιστρέψει τον αριθμό των βιβλίων που γράφτηκαν από έναν συγκεκριμένο συγγραφέα. Θα εξετάσουμε την πρώτη μέθοδο με τον τρόπο που κάνουμε πάντα, χωρίς να χρησιμοποιούμε XPath. Τώρα θα καταλάβετε πώς να το κάνετε αυτό χωρίς το XPath και πόσο πιο εύκολο είναι να το κάνετε με το XPath.

domDocument->getElementsByTagName("author"); foreach ($elements ως $element) ( if ($element->nodeValue == $author) ( $total++; ) ) return $number; )

Η επόμενη μέθοδος επιστρέφει το ίδιο αποτέλεσμα, αλλά χρησιμοποιεί το XPath για να επιλέξει εκείνα τα βιβλία που έχουν γραφτεί από έναν συγκεκριμένο συγγραφέα.

domDocument); $result = $xpath->query($query); επιστροφή $result->length; )

Σημειώστε ότι δεν χρειάζεται να ελέγξουμε ξανά την τιμή κάθε στοιχείου για να προσδιορίσουμε ποιος συγγραφέας έγραψε κάθε βιβλίο. Μπορούμε όμως να απλοποιήσουμε περισσότερο τον κώδικα χρησιμοποιώντας τη συνάρτηση XPath μετρώ()για να μετρήσετε τα περιεχόμενα των στοιχείων σε αυτή τη διαδρομή.

domDocument); return $xpath->evaluate($query); )

Μπορούμε να λάβουμε τις πληροφορίες που χρειαζόμαστε με ένα ερώτημα XPath μίας γραμμής. Δεν χρειάζεται να δημιουργήσετε πολλά φίλτρα PHP. Αυτός είναι ο πιο εύκολος και γρήγορος τρόπος για να γράψετε αυτήν τη λειτουργικότητα!

Σημειώστε ότι η αξιολόγηση() χρησιμοποιήθηκε στο τελευταίο παράδειγμα. Αυτό συμβαίνει επειδή η συνάρτηση count() επιστρέφει ένα αποτέλεσμα κειμένου. Η χρήση του query() θα επιστρέψει ένα DOMNodeList, αλλά θα είναι κενό.

Το XPath αξίζει να το χρησιμοποιήσετε γιατί όχι μόνο κάνει απλούστερο τον κώδικα PHP σας, αλλά προσφέρει επίσης πλεονέκτημα ταχύτητας. Παρατήρησα ότι η πρώτη έκδοση ήταν 30% πιο γρήγορη κατά μέσο όρο σε σύγκριση με τη δεύτερη. Αλλά το τρίτο είναι 10% πιο γρήγορο από το πρώτο. Φυσικά, αυτό εξαρτάται από τον διακομιστή σας και τα ερωτήματα που χρησιμοποιείτε. Η χρήση του XPath στην καθαρή του μορφή δίνει τα μέγιστα αποτελέσματα σε ταχύτητα και ευκολία γραφής κώδικα.

Λειτουργίες XPath

Ακολουθούν μερικές λειτουργίες που μπορούν να χρησιμοποιηθούν με το XPath. Θα βρείτε επίσης πολλούς πόρους που αναφέρονται σε λεπτομέρειες για κάθε διαθέσιμη λειτουργία. Εάν πρέπει να υπολογίσετε το DOMNodeList ή να συγκρίνετε nodeValue (τιμή κόμβου), μπορείτε να βρείτε μια κατάλληλη συνάρτηση XPath που εξαλείφει τη χρήση περιττού κώδικα PHP.

Αυτό το γνωρίζετε ήδη από το παράδειγμα της συνάρτησης count(). Ας χρησιμοποιήσουμε τη συνάρτηση id() για να λάβουμε τους τίτλους των βιβλίων με τα δεδομένα ISBN. Για να το κάνετε αυτό, πρέπει να χρησιμοποιήσετε την ακόλουθη έκφραση XPath:

id("isbn1234 isbn1235")/τίτλος

Σημειώστε ότι οι τιμές που αναζητάτε δεν πρέπει να περικλείονται σε παρένθεση, αλλά να χωρίζονται με κενά. Επίσης, μην σκεφτείτε καν να προσθέσετε κόμμα:

domDocument); $result = $xpath->query($query); $books = array(); foreach ($result ως $node) ( $book = array("title" => $booknode->nodeValue); $books = $book; ) επιστροφή $books; )

Ο χειρισμός πολύπλοκων λειτουργιών στο XPath είναι απίστευτα απλός.

Χρήση συναρτήσεων PHP με XPath

Μερικές φορές θα χρειαστείτε περισσότερη λειτουργικότητα που δεν μπορούν να παρέχουν οι τυπικές συναρτήσεις XPath. Ευτυχώς, το PHP DOM επιτρέπει στις εγγενείς λειτουργίες PHP να αλληλεπιδρούν με ερωτήματα XPath.

Ας δούμε ένα παράδειγμα που επιστρέφει τον αριθμό των λέξεων σε έναν τίτλο βιβλίου. Σε αυτήν την απλούστερη συνάρτηση, θα γράψουμε τα εξής:

domDocument); $result = $xpath->query($query); $title = $result->item(0)->getElementsByTagName("title") ->item(0)->nodeValue; επιστροφή str_word_count($title); )

Αλλά, μπορούμε επίσης να συμπεριλάβουμε τη συνάρτηση str_word_count() απευθείας στο αίτημα XPath. Αυτό μπορεί να γίνει σε μερικά βήματα. Πρώτα απ 'όλα, πρέπει να καταχωρήσουμε τον χώρο ονομάτων με ένα αντικείμενο XPath. Οι συναρτήσεις PHP στα αιτήματα XPath καλούνται χρησιμοποιώντας τη συμβολοσειρά "php:functionString", μετά την οποία γράφεται το όνομα της επιθυμητής συνάρτησης. Επίσης, ο χώρος ονομάτων συζητείται με περισσότερες λεπτομέρειες στη διεύθυνση http://php.net/xpath. Άλλες τιμές χώρου ονομάτων θα δημιουργήσουν σφάλμα. Μετά από αυτό πρέπει να καλέσουμε registerPHPFunctions(). Αυτή η συνάρτηση λέει στην PHP ότι όταν γίνεται μια κλήση μέσω του χώρου ονομάτων "php:", η PHP θα χειριστεί αυτήν την κλήση.

Ένα παράδειγμα σύνταξης για την κλήση συναρτήσεων θα ήταν:

php:functionString("nameoffunction", arg, arg...)

Ας τα συγκεντρώσουμε όλα μαζί στο ακόλουθο παράδειγμα συνάρτησης getNumberOfWords():

domDocument); //register php namespace $xpath->registerNamespace("php", "http://php.net/xpath"); //τώρα οι συναρτήσεις php μπορούν να καλούνται σε αιτήματα xpath $xpath->registerPHPFunctions(); $query = "php:functionString("str_word_count",(//library/book[@isbn = "$isbn"]/title)"; return $xpath->evaluate($query); )

Σημειώστε ότι δεν χρειάζεται να καλέσετε τη συνάρτηση XPath text() για να λάβετε το κείμενο του κόμβου. Η μέθοδος registerPHPFunctions() το κάνει αυτόματο. Αν και, το ακόλουθο παράδειγμα γραμμής κώδικα θα είναι επίσης έγκυρο:

php:functionString("str_word_count",(//library/book[@isbn = "$isbn"]/title))

Η καταχώρηση συναρτήσεων PHP δεν περιορίζεται σε συναρτήσεις που περιλαμβάνονται στην PHP. Μπορείτε να ορίσετε τις δικές σας συναρτήσεις και να τις χρησιμοποιήσετε μέσα στο XPath. Η μόνη διαφορά είναι ότι θα πρέπει να χρησιμοποιήσετε το "php:function" αντί για το "php:functionString".

Ας γράψουμε μια συνάρτηση εκτός τάξης για να δείξουμε τη βασική λειτουργικότητα. Η συνάρτηση που θα χρησιμοποιήσουμε επιστρέφει τα βιβλία του συγγραφέα «Τζορτζ Όργουελ». Θα πρέπει να επιστρέψει true για κάθε κόμβο που θέλετε να συμπεριλάβετε στο ερώτημα.

nodeValue == "George Orwell"; } !}

Το όρισμα που μεταβιβάζεται στη συνάρτηση είναι ένας πίνακας στοιχείων DOM. Αυτή η συνάρτηση περνά μέσα από τον πίνακα και καθορίζει τα απαραίτητα στοιχεία και στη συνέχεια τα περιλαμβάνει στη λίστα DOMNodeList. Σε αυτό το παράδειγμα, ο κόμβος που ελέγχεται ήταν /book και χρησιμοποιήσαμε επίσης το /author για να προσδιορίσουμε τα απαιτούμενα στοιχεία.

Τώρα μπορούμε να δημιουργήσουμε τη συνάρτηση getGeorgeOrwellBooks():

domDocument); $xpath->registerNamespace("php", "http://php.net/xpath"); $xpath->registerPHPFunctions(); $query = "//library/book1"; $result = $xpath->query($query); $books = array(); foreach($result as $node) ( $books = $node->getElementsByTagName("title") ->item(0)->nodeValue; ) return $books; )

Εάν η συνάρτηση compare() είναι στατική, τότε πρέπει να τροποποιήσετε το ερώτημα XPath:

//βιβλιοθήκη/βιβλίο

Για να είμαι ειλικρινής, όλη αυτή η λειτουργικότητα θα μπορούσε να είχε υλοποιηθεί χρησιμοποιώντας καθαρό κώδικα XPath. Αλλά το παράδειγμα δείχνει πώς μπορείτε να επεκτείνετε τα ερωτήματα XPath και να τα κάνετε πιο περίπλοκα.

Συμπερασματικά

XPathείναι ένας πολύ καλός τρόπος για να μειώσετε την ποσότητα του κώδικα και να αυξήσετε την επεξεργασία του όταν εργάζεστε με XML. Η πρόσθετη λειτουργικότητα PHP DOM σάς επιτρέπει να επεκτείνετε τις λειτουργίες XPath. Αυτό είναι ένα πραγματικά χρήσιμο πράγμα, αν το χρησιμοποιήσετε και εμβαθύνετε στις ιδιαιτερότητες, θα πρέπει να γράφετε όλο και λιγότερο κώδικα.


Το XPath χρησιμοποιεί εκφράσεις διαδρομής για να επιλέξει κόμβους σε ένα έγγραφο XML ή ένα σύνολο κόμβων. Με κόμβο κατά μήκος της διαδρομής (μονοπάτι) ή στάδιο (βήματα) προς την επιλεγμένη.

παράδειγμα εγγράφων XML

Θα χρησιμοποιήσουμε αυτό το έγγραφο XML στα παρακάτω παραδείγματα.


Χάρρυ Πόττερ
29.99


Εκμάθηση XML
39.95

Επιλέξτε κόμβο

Το XPath χρησιμοποιεί εκφράσεις διαδρομής για να επιλέξει κόμβους σε ένα έγγραφο XML. Ή κατά μήκος της διαδρομής μέσω ενός κόμβου για να επιλέξετε ένα βήμα. Οι παρακάτω είναι οι πιο χρήσιμες εκφράσεις διαδρομής:

Στον παρακάτω πίνακα παρουσιάζουμε μερικές από τις διαδρομές έκφρασης και το αποτέλεσμα της έκφρασης:

έκφραση μονοπάτιαποτέλεσμα
βιβλιοπωλείοΕπιλέξτε όλους τους θυγατρικούς κόμβους του στοιχείου βιβλίου.
/ Βιβλιοπωλείο

Επιλέξτε το βιβλιοπωλείο ριζικού στοιχείου.

Σημείωση: Εάν μια διαδρομή ξεκινά με κάθετο (/), η διαδρομή είναι πάντα αντιπροσωπευτική της απόλυτης διαδρομής του στοιχείου!

βιβλιοπωλείο/βιβλίοΕπιλέξτε τα υποστοιχεία που ανήκουν στο βιβλιοπωλείο all bookitems.
// ΒιβλίοΕπιλέξτε όλα τα υποστοιχεία του βιβλίου, ανεξάρτητα από τη θέση τους στο έγγραφο.
βιβλιοπωλείο // βιβλίοΕπιλέγει όλα τα στοιχεία του βιβλίου που δεν είναι απόγονοι του βιβλιοπωλείου του στοιχείου, ανεξάρτητα από τη θέση τους μέσα και κάτω από το βιβλιοπωλείο.
// @LangΕπιλέξτε όλα τα ακίνητα με το όνομα Lang.

Κατηγόρημα(α)

Ένα κατηγόρημα χρησιμοποιείται για την εύρεση ενός συγκεκριμένου κόμβου ή κόμβου που περιέχει την καθορισμένη τιμή.

Το κατηγόρημα περικλείεται σε αγκύλες.

Στον παρακάτω πίνακα, έχουμε παραθέσει ορισμένες εκφράσεις διαδρομής με κατηγορήματα και το αποτέλεσμα της έκφρασης:

έκφραση μονοπάτιαποτέλεσμα
/ Βιβλιοπωλείο / βιβλίοΕπιλέξτε τα υποστοιχεία που ανήκουν στο πρώτο στοιχείο του βιβλίου εργασίας.
/Βιβλιοπωλείο/βιβλίο [τελευταίο()]Επιλέξτε τα υποστοιχεία που ανήκουν στο στοιχείο του τελευταίου βιβλίου.
/ Βιβλιοπωλείο / βιβλίο [τελευταίο () - 1]Επιλέξτε τα επιμέρους είδη που σχετίζονται με το αμοιβαίο βιβλιοπωλείο του δεύτερου τεμαχίου βιβλίου.
/Βιβλιοπωλείο/βιβλίο [θέση()<3] Επιλέξτε τα δύο πρώτα στοιχεία βιβλίου του στοιχείου βιβλίου που ανήκουν στα υποστοιχεία.
// Τίτλος [@lang]Επιλέξτε όλα τα χαρακτηριστικά με το όνομα Lang έχει τίτλο στοιχείου.
// Τίτλος [@ LANG = "eng"]Επιλέξτε όλα τα ονόματα στοιχείων και αυτά τα στοιχεία έχουν την αγγλική τιμή χαρακτηριστικού.
/βιβλιοπωλείο/βιβλίοΕπιλέξτε όλα τα στοιχεία βιβλίου του στοιχείου βιβλίου και την τιμή του στοιχείου τιμής, η οποία πρέπει να είναι μεγαλύτερη από 35,00.
/βιβλιοπωλείο/βιβλίο/τίτλοςΕπιλέξτε όλα τα στοιχεία κεφαλίδας στοιχείου βιβλίου του στοιχείου βιβλίου και στα οποία η τιμή του στοιχείου τιμής πρέπει να είναι μεγαλύτερη από 35,00.

Επιλέξτε άγνωστους κόμβους

Οι χαρακτήρες μπαλαντέρ XPath μπορούν να χρησιμοποιηθούν για την επιλογή άγνωστων στοιχείων XML.

Στον παρακάτω πίνακα, έχουμε παραθέσει ορισμένες εκφράσεις διαδρομής καθώς και τα αποτελέσματα αυτών των παραστάσεων:

Επιλέξτε πολλαπλές διαδρομές

Χρησιμοποιώντας την έκφραση διαδρομής "|" χειριστή, μπορείτε να επιλέξετε πολλά μονοπάτια.

Στον παρακάτω πίνακα, έχουμε παραθέσει ορισμένες εκφράσεις διαδρομής καθώς και τα αποτελέσματα αυτών των παραστάσεων.