Η XML (eXtensible Markup Language) είναι μια μορφή δεδομένων για ανταλλαγή δομημένων αρχείων στο Web. Είναι ένα standard καθορισμένο από το The World Wide Web consortium (W3C). Πληροφορίες σχετικά με την XML και τις συσχετιζόμενες μ'αυτήν τεχνολογίες μπορείτε να βρείτε στο http://www.w3.org/XML/.
Αυτή η επέκταση της PHP υλοποιεί υποστήριξη για την expat του James Clark στην PHP. Αυτό το εργαλείο σας επιτρέπεται να μεταγλωτίσετε, αλλά όχι να ελένξετε την εγκυρότητα, των XML αρχείων. Υποστηρίζει τρία πηγές κωδικοποίησης χαρακτήρων που παρέχονται επίσης και από την by PHP: την US-ASCII, την ISO-8859-1 και την UTF-8. Η UTF-16 δεν υποστηρίζεται.
Αυτή η επέκταση σας επιτρέπει να δημιουργήσετε XML parsers και στη συνέχεια να ορίσετε handlers για διαφορετικά XML events. Ο κάθε XML parser έχει επίσης και μερικές παραμέτρους τις οποίες μπορείτε να ρυθμίσετε.
Αυτή η επέκταση χρησιμοποιεί την expat, η οποία μπορεί να βρεθεί στο http://www.jclark.com/xml/expat.html. Η Makefile που συνοδεύει την expat δεν δημιουργεί μια library εκ των πραγμάτων, μπορείτε να χρησιμοποιήσετε αυτό για να δημιουργήσετε έναν κανόνα για εκείνο:
libexpat.a: $(OBJS) ar -rc $@ $(OBJS) ranlib $@ |
Αυτές οι συναρτήσεις είναι ενεργοποιημένες by default, χρησιμοποιώντας την bundled expat library. Μπορείτε να απενεργοποιήσετε την υποστήριξη της XML με την --disable-xml. Αν κάνετε compile την PHP ως module για τον Apache 1.3.9 και μετά, η PHP θα χρησιμοποιήσει αυτόματα την bundled expat library από τον Apache. Σε περίπτωση που δε θέλετε να χρησιμοποιήσετε την bundled expat library ρυθμίστε την PHP --with-expat-dir=DIR, όπου η DIR θα πρέπει να δείχνει στο βασικό κατάλογο εγκατάστασης του expat.
Η έκδοση για windows της PHP έχει ενσωματωμένη υποστήριξη για αυτή την επέκταση. Δεν χρειάζεται να φορτώσετε κάποια πρόσθετη επέκταση για να χρησιμοποιήσετε αυτές τις συναρτήσεις.
Αυτή η επέκταση δεν έχει directives ρύθμισης ορισμένα στο php.ini.
Η xml resource όπως επιστρέφεται από την xml_parser_create() και την xml_parser_create_ns() κάνει αναφορά σε ένα στιγμιότυπο του xml parser για να χρησιμοποιηθεί με τις συναρτήσεις που παρέχονται από αυτή την επέκταση.
Οι σταθερές παρακάτω ορίζονται από αυτή την επέκταση, και θα είναι διαθέσιμες μόνο αν η επέκταση έχει γίνει compile μέσα στην PHP ή έχει φορτωθεί δυναμικά κατά την εκτέλεση.
Οι event handlers (χειριστές γεγονότων) της XML που έχουν οριστεί είναι:
Ðßíáêáò 1. XML handlers που υποστηρίζονται
Συνάρτηση της PHP που ορίζει τον handler | Περιγραφή Event |
---|---|
xml_set_element_handler() | Τα events ενός στοιχείου ενεργοποιούνται όταν ο XML parser συναντά tags αρχής ή τέλους. Υπάρχουν ξεχωριστοί handlers για tags αρχής και tags τέλους. |
xml_set_character_data_handler() | Τα δεδομένα χαρακτήρων είναι σχεδόν όλα τα περιεχόμενα των XML αρχείων που δεν είναι markup, συμπεριλαμβανομένου των κενών ανάμεσα στα tags. Σημειώστε ότι ο XML parser δεν προσθέτει ή αφαιρεί κάποιο κενό, εξαρτάται από την εφαρμογή σας (από εσάς) να αποφασισθεί αν τα κενά είναι σημαντικά. |
xml_set_processing_instruction_handler() | Οι προγραμματιστές σε PHP έχουν οικειότητα με εντολές διαδικασιών (processing instructions - PIs). Η <?php ?> είναι μια processing instruction, όπου η php καλείται "PI target". Ο χειρισμός αυτών καθορίζεται από τις εφαρμογές, εκτός από το οτι όλοι οι PI targets που αρχίζουν με "XML" είναι δεσμευμένοι. |
xml_set_default_handler() | Ό,τι δεν πάει σε κάποιο άλλο handler πηγαίνει στον προκαθορισμένο handler. Θα πάρετε πράγματα όπως η XML και η δήλωση τύπων του αρχείου στο προκαθορισμένο handler. |
xml_set_unparsed_entity_decl_handler() | Αυτός ο handler θα καλείται για δήλωση μια οντότητας (NDATA) στην οποία δεν έχει γίνει parse. |
xml_set_notation_decl_handler() | Αυτός ο handler καλείται για δήλωση μια σημείωσης (notation). |
xml_set_external_entity_ref_handler() | Αυτός ο handler καλείται όταν ο XML parser βρίσκει μια αναφορά σε μια εξωτερικά μεταγλωττισμένη γενική οντότητα. Αυτό μπορεί να είναι ναναφορά σε ένα αρχείο ή σε ένα URL, για παράδειγμα. Δείτε το παράδειγμα για εξωτερικές οντότητες για μια επίδειξη. |
Οι συναρτήσεις που χειρίζονται ένα στοιχείο μπορούν να πάρουν τα element ονόματα τους ως case-folded. Το Case-folding ορίζεται από το standard της XML ως "η διαδικασία που εφαρμόζεται σε μια ακολουθία χαρακτήρων, στην οποία αυτοί οι identified ως μη-κεφαλαίοι αντικαθίστανται από τους αντίστοιχους τους κεφαλαίους". Με άλλα λόγια, όταν ερχόμαστε στην XML, το case-folding σημαίνει απλά μετατροπή σε κεφαλαία.
Είναι προκαθορισμένο ότι όλα τα ονόματα των στοιχείων που περνούν σε συναρτήσεις handler είναι case-folded. Αυτή η συμπεριφορά μπορεί να ερωτηθεί και να ελενχθεί ανά XML parser με τις συναρτήσεις xml_parser_get_option() και xml_parser_set_option() , αντίστοιχα.
Οι ακόλουθες σταθερές έχουν οριστεί για κωδικούς λάθους της XML (όπως επιστρέφονται από την xml_parse()):
XML_ERROR_NONE |
XML_ERROR_NO_MEMORY |
XML_ERROR_SYNTAX |
XML_ERROR_NO_ELEMENTS |
XML_ERROR_INVALID_TOKEN |
XML_ERROR_UNCLOSED_TOKEN |
XML_ERROR_PARTIAL_CHAR |
XML_ERROR_TAG_MISMATCH |
XML_ERROR_DUPLICATE_ATTRIBUTE |
XML_ERROR_JUNK_AFTER_DOC_ELEMENT |
XML_ERROR_PARAM_ENTITY_REF |
XML_ERROR_UNDEFINED_ENTITY |
XML_ERROR_RECURSIVE_ENTITY_REF |
XML_ERROR_ASYNC_ENTITY |
XML_ERROR_BAD_CHAR_REF |
XML_ERROR_BINARY_ENTITY_REF |
XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF |
XML_ERROR_MISPLACED_XML_PI |
XML_ERROR_UNKNOWN_ENCODING |
XML_ERROR_INCORRECT_ENCODING |
XML_ERROR_UNCLOSED_CDATA_SECTION |
XML_ERROR_EXTERNAL_ENTITY_HANDLING |
Η επέκταση σε XML της PHP υποστηρίζει το σύνολο χαρακτήρων Unicode διαμέσου διαφορετικών κωδικοποιήσεων χαρακτήρων. Υπάρχουν δύο τύποι κωδικοποίησης χαρακτήρων, η source κωδικοποίηση και η target κωδικοποίηση. η εσωτερική αναπαράσταση της PHP ενός αρχείου είναι πάντα κωδικοποιημένη με UTF-8.
Η Source κωδικοποίηση γίνεται όταν ένα XML αρχείο μεταγλωττίζεται. Όταν δημιουργείται ένας XML parser, η source κωδικοποίηση μπορεί να προσδιοριστεί (αυτή η κωδικοποίηση δεν μπορεί να αλλάξει αργότερα στο χρόνο ζωής του XML parser). Οι source κωδικοποιήσεις που υποστηρίζονται είναι η ISO-8859-1, η US-ASCII και η UTF-8. Οι δυο πρώτες είναι single-byte κωδικοποιήσεις, το οποίο σημαίνει ότι κάθε χαρακτήρας αναπαρίσταται από ένα μόνο byte. Η UTF-8 μπορεί να κωδικοποιήσει χαρακτήρες που αποτελούνται από έναν μεταβλητό αριθμό από bits (μέχρι 21) από ένα μέχρι τέσσετα bytes. Η προκαθορισμένη source κωδικοποίηση που χρησιμοποιείται στην PHP είναι η ISO-8859-1.
Η Target κωδικοποίηση γίνεται όταν η PHP μεταφέρει δεδομένα σε XML handler συναρτήσεις. Όταν ένας XML parser δημιουργείται, η target κωδικοποίηση ορίζεται ίδια με την source κωδικοποίηση, αλλά αυτό μπορεί να αλλάξει σε οποιοδήποτε σημείο. Η target κωδικοποίηση θα επηρεάσει τα δεδομένα των χαρακτήρων καθώς επίσης και τα ονόματα των tags και τα processing instruction targets.
Αν ο XML parser συναντήσει χαρακτήρες εκτός πεδίου που η source κωδικοποίηση μπορεί να αναπαραστήσει, θα επιστρέψει ένα λάθος.
Αν η PHP συνατήσει χαρακτήρες στο μεταγλωττισμένο XML αρχείο που δεν μπορεί να αναπαραστήσει στην επιλεγμένη target κωδικοποίηση, οι προβληματικοί χαρακτήρες θα "υποβιβαστούν". Προσ το παρόν, αυτό σημαίνει ότι τέτοιοι χαρακτήρες αντικαθίστανται από το αγγλικό ερωτηματικό.
Εδώ υπάρχουν μερικά ενδεικτικά PHP scripts που κάνουν μεταγλώττιση σε XML αρχεία.
Το πρώτο παράδειγμα εμφανίζει τη δομή των αρχικών elements σε ένα αρχείο με εσοχές.
ÐáñÜäåéãìá 2. Αντιστοιχία XML σε HTML Αυτό το παράδειγμα αντιστοιχεί τα tags σε ένα XML αρχείο κατευθείαν σε HTML tags. Τα Elements που δεν υπάρχουν στον "map array" αγνοούνται. Φυσικά, αυτό το παράδειγμα θα δουλέψει με ένα συγκεκριμένο XML τύπο αρχείου.
|
Αυτό το παράδειγμα αντικατοπτρίζει τον XML κώδικα. Δείχνει πως να χρησιμοποιήσετε έναν external entity reference handler για να συμπεριλάβετε και να κάνετε parse και σε άλλα αρχεία, καθώς επίσης και πώς οι PIs μπορούν να εκτελεστούν, και έναν τρόπο για να καθοριστούν οι "έμπιστοι" PIs που περιέχουν κώδικα.
Τα XML αρχεία που μπορούν να χρησιμοποιηθούν σ'αυτό το παράδειγμα βρίσκονται κάτω από το παράδειγμα (xmltest.xml και xmltest2.xml.)
ÐáñÜäåéãìá 3. Πάραδειγμα για External Entity
|
ÐáñÜäåéãìá 4. xmltest.xml
|
Αυτό το αρχείο συμπεριλαμβάνεται από το xmltest.xml: