Ανάλυση html με χρήση xml. Σε τι χρησιμεύουν οι αναλυτές XML και πώς μπορούν να είναι χρήσιμοι;

Ηλεκτρονική 20.04.2019
Επισκόπηση προγράμματος Η έκδοση υπολογιστή του Microsoft Excel Viewer θα επιτρέψει...

ChercherΗλεκτρονική Xml αναλυτήςδεδομένα μορφής xml και αποθηκεύει ή χρησιμοποιεί για επόμενες ενέργειες.

Γιατί χρειάζονται οι αναλυτές xml;

Πρώτα απ 'όλα, επειδή η ίδια η μορφή xml είναι δημοφιλής πρότυπα υπολογιστών. Το αρχείο XML μοιάζει με αυτό:

εκείνοι. ουσιαστικά υπάρχουν ετικέτες, υπάρχουν κάποιοι κανόνες για τους οποίους οι ετικέτες πρέπει να ακολουθούν η μία την άλλη.

Λόγος δημοτικότητας xml αρχείαείναι ότι διαβάζεται καλά από τον άνθρωπο. Και το γεγονός ότι είναι σχετικά εύκολο να επεξεργαστεί σε προγράμματα.

Μειονεκτήματα των αρχείων xml.

Το μειονέκτημα είναι πρώτα απ' όλα μεγάλο αριθμόχώρο στο δίσκο που καταλαμβάνουν αυτά τα δεδομένα. Λόγω του ότι οι ετικέτες που επαναλαμβάνονται συνεχώς, όταν μεγάλους όγκουςδεδομένων, καταλαμβάνει ένα σχετικά μεγάλο αριθμό megabyte, τα οποία απλά πρέπει να ληφθούν από την πηγή και στη συνέχεια να υποβληθούν σε επεξεργασία. Υπάρχουν εναλλακτικές λύσεις; Υπάρχουν, φυσικά, αλλά και πάλι, οι αναλυτές xml και το xml είναι σήμερα μια από τις απλούστερες και πιο αξιόπιστες και τεχνολογικά δημοφιλείς μορφές.

Πώς γράφονται οι αναλυτές XML;

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

Σε παγκόσμιο επίπεδο, υπάρχουν 2 διαφορετικές προσεγγίσεις για την ανάλυση αρχείων xml.

Το πρώτο είναι να φορτώσετε πλήρως το αρχείο xml στη μνήμη και στη συνέχεια να κάνετε χειρισμούς για να εξαγάγετε δεδομένα.

Η δεύτερη είναι η επιλογή ροής. Σε αυτήν την περίπτωση, η γλώσσα προγραμματισμού ορίζει ορισμένες ετικέτες στις οποίες πρέπει να αντιδράσουν οι λειτουργίες του αναλυτή xml που δημιουργήθηκε και ο ίδιος ο προγραμματιστής αποφασίζει τι πρέπει να γίνει εάν εντοπιστεί μια συγκεκριμένη ετικέτα.

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

απαιτείται μεγάλη ποσότητα μνήμης για τη λειτουργία. Μερικές φορές, θα έλεγα ότι συμβαίνει συχνά ότι είναι απλά αδύνατο να επεξεργαστείτε και να αναλύσετε ένα αρχείο xml, π.χ. δημιουργήστε έναν αναλυτή xml έτσι ώστε η πρώτη μέθοδος να λειτουργεί σωστά. Γιατί συμβαίνει αυτό; Λοιπόν, για παράδειγμα, ο περιορισμός για εφαρμογές 32 bit στα Windows επιτρέπει στο πρόγραμμα να καταλαμβάνει το πολύ 2 gigabyte μνήμης - αυτό δεν είναι πλέον δυνατό.

Ωστόσο, ο προγραμματισμός που βασίζεται σε νήματα είναι δύσκολος. Η πολυπλοκότητα μιας αρκετά σοβαρής εξόρυξης αυξάνεται σημαντικά, γεγονός που επηρεάζει ανάλογα τόσο το χρονικό πλαίσιο όσο και τον προϋπολογισμό.

Εγκυρότητα αρχείων xml και αναλυτών.

Όλα θα ήταν καλά με τα αρχεία xml και τους αναλυτές xml, αλλά υπάρχει ένα πρόβλημα. Λόγω του γεγονότος ότι "οποιοσδήποτε μαθητής" μπορεί να δημιουργήσει ένα αρχείο xml, και στην πραγματικότητα αυτό ισχύει (επειδή γράφεται πολύς κώδικας από μαθητές), εμφανίζονται άκυρα αρχεία, δηλαδή λανθασμένα Τι σημαίνει αυτό και με τι είναι γεμάτο Το μεγαλύτερο πρόβλημα είναι ότι μερικές φορές είναι απλώς αδύνατο να αναλυθεί σωστά ένα μη έγκυρο αρχείο, για παράδειγμα, οι ετικέτες του δεν είναι κλειστές όπως αναμένεται από το πρότυπο, ή για παράδειγμα, η κωδικοποίηση είναι λανθασμένη. για παράδειγμα, φτιάχνεις έναν αναλυτή στο .net, μετά μπορείς να δημιουργήσεις τα λεγόμενα περιτυλίγματα και το πιο ενοχλητικό είναι ότι φτιάχνεις ένα τέτοιο περιτύλιγμα και μετά το χρησιμοποιείς για να διαβάσεις το αρχείο που δημιούργησε ο «μαθητής», αλλά. Το αρχείο δεν είναι έγκυρο και αδύνατο να το διαβάσετε, επομένως, πρέπει να το ξεφορτωθείτε και να καταφύγετε σε πολύ, πολύ μη δημοφιλείς επιλογές για την ανάλυση τέτοιων αρχείων =λόγω του γεγονότος ότι πολλοί δημιουργούν xml αρχεία τυπικές βιβλιοθήκεςκαι με πλήρη αποστροφή σε όλα τα πρότυπα αρχείων xml. Αυτό είναι δύσκολο να εξηγηθεί στους πελάτες. Περιμένουν το αποτέλεσμα - έναν αναλυτή xml που μετατρέπει δεδομένα από αρχικό αρχείοσε διαφορετική μορφή.

Πώς να δημιουργήσετε αναλυτές xml (πρώτη επιλογή)

Υπάρχει μια γλώσσα ερωτημάτων για δεδομένα XML που ονομάζεται Xpath. Αυτή η γλώσσα έχει δύο εκδόσεις, δεν θα μπούμε σε λεπτομέρειες σχετικά με τα χαρακτηριστικά κάθε έκδοσης. Μια καλύτερη ιδέα αυτής της γλώσσας θα φανεί με παραδείγματα για το πώς να τη χρησιμοποιήσετε για την εξαγωγή δεδομένων. Για παράδειγμα.

//div[@class="supcat γκουρού"]/a

τι κάνει αυτό το αίτημα. Παίρνει όλες τις ετικέτες που έχω ένα ref που περιέχει το κείμενο catalog.xml?hid= και αυτή η ετικέτα πρέπει να είναι ένα παιδί div του οποίου η κλάση είναι ίση με το supcat guru.

Ναι, μπορεί να μην είναι αρκετά σαφές την πρώτη φορά, αλλά μπορείτε ακόμα να το καταλάβετε αν θέλετε. Το σημείο εκκίνησης για μένα είναι το http://ru.wikipedia.org/wiki/XPath και σας συμβουλεύω.

Η ανάλυση XML ουσιαστικά σημαίνει περπάτημα σε ένα έγγραφο XML και επιστροφή των αντίστοιχων δεδομένων. Και παρόλο που τα πάντα μεγαλύτερο αριθμόυπηρεσίες web επιστρέφουν δεδομένα σε Μορφή JSON, αλλά οι περισσότεροι εξακολουθούν να χρησιμοποιούν XML, επομένως είναι σημαντικό να κυριαρχήσετε στην ανάλυση XML εάν θέλετε να χρησιμοποιήσετε το πλήρες φάσμα των διαθέσιμων API.

Χρησιμοποιώντας την επέκταση SimpleXMLστην PHP, η οποία προστέθηκε ξανά στην PHP 5.0, η εργασία με XML είναι πολύ εύκολη και απλή. Σε αυτό το άρθρο θα σας δείξω πώς να το κάνετε.

Βασικά στοιχεία χρήσης

Ας ξεκινήσουμε με το παρακάτω παράδειγμα γλώσσες.xml:


>

> 1972>
> Ντένις Ρίτσι >
>

> 1995>
> Ράσμους Λέρντορφ >
>

> 1995>
> Τζέιμς Γκόσλινγκ >
>
>

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

Το πρώτο βήμα είναι να φορτώσετε το XML χρησιμοποιώντας είτε τις συναρτήσεις simplexml_load_file(), ή simplexml_load_string(). Όπως υποδηλώνει το όνομα των συναρτήσεων, η πρώτη θα φορτώσει XML από ένα αρχείο και η δεύτερη θα φορτώσει XML από μια συμβολοσειρά.

Και οι δύο συναρτήσεις διαβάζουν ολόκληρο το δέντρο DOM στη μνήμη και επιστρέφουν ένα αντικείμενο SimpleXMLEστοιχείο. Στο παραπάνω παράδειγμα, το αντικείμενο αποθηκεύεται στη μεταβλητή $languages. Μπορείτε να χρησιμοποιήσετε τις λειτουργίες var_dump()ή print_r()για να λάβετε λεπτομέρειες σχετικά με το επιστρεφόμενο αντικείμενο εάν θέλετε.

Αντικείμενο SimpleXMLElement
[lang] => Πίνακας
[ 0 ] => Αντικείμενο SimpleXMLElement
[@attributes] => Πίνακας
[όνομα] => Γ
[εμφανίστηκε] => 1972
[δημιουργός] => Ντένις Ρίτσι
[ 1 ] => Αντικείμενο SimpleXMLElement
[@attributes] => Πίνακας
[όνομα] => PHP
[εμφανίστηκε] => 1995
[δημιουργός] => Rasmus Lerdorf
[ 2 ] => Αντικείμενο SimpleXMLElement
[@attributes] => Πίνακας
[όνομα] => Java
[εμφανίστηκε] => 1995
[δημιουργός] => Τζέιμς Γκόσλινγκ
)
)

Αυτό το XML περιέχει ένα ριζικό στοιχείο γλώσσες, στο εσωτερικό του οποίου υπάρχουν τρία στοιχεία lang.Κάθε στοιχείο πίνακα αντιστοιχεί σε ένα στοιχείο langστο έγγραφο XML.

Μπορείτε να αποκτήσετε πρόσβαση στις ιδιότητες ενός αντικειμένου χρησιμοποιώντας τον τελεστή -> . Για παράδειγμα, το $languages->lang θα σας επιστρέψει ένα αντικείμενο SimpleXMLElement που ταιριάζει με το πρώτο στοιχείο lang. Αυτό το αντικείμενο περιέχει δύο ιδιότητες: εμφανίστηκε και δημιουργός.

$languages ​​-> lang [ 0 ] -> εμφανίστηκε ;
$languages ​​-> lang [ 0 ] -> creator ;

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

foreach ($languages ​​-> lang as $lang ) (
printf(
"" ,
$lang ["όνομα" ],
εμφανίστηκε το $lang ->,
$lang -> δημιουργός
) ;
}

Παρατηρήστε πώς είχα πρόσβαση στο όνομα του χαρακτηριστικού lang του στοιχείου για να λάβω το όνομα της γλώσσας. Με αυτόν τον τρόπο μπορείτε να αποκτήσετε πρόσβαση σε οποιοδήποτε χαρακτηριστικό ενός στοιχείου που αναπαρίσταται ως αντικείμενο SimpleXMLElement.

Εργασία με Χώρους Ονομάτων

Ενώ εργάζεστε με XML διαφόρων υπηρεσιών Ιστού, θα συναντήσετε χώρους ονομάτων στοιχείων περισσότερες από μία φορές. Ας αλλάξουμε το δικό μας γλώσσες.xmlγια να δείξετε ένα παράδειγμα χρήσης χώρου ονομάτων:



xmlns:dc =>

> 1972>
> Ντένις Ρίτσι >
>

> 1995>
> Ράσμους Λέρντορφ >
>

> 1995>
> Τζέιμς Γκόσλινγκ >
>
>

Τώρα το στοιχείο δημιουργόςταιριάζει στον χώρο ονομάτων dcπου οδηγεί στη διεύθυνση http://purl.org/dc/elements/1.1/. Εάν προσπαθήσετε να εκτυπώσετε τους δημιουργούς γλώσσας χρησιμοποιώντας τον προηγούμενο κώδικα, δεν θα λειτουργήσει. Για να διαβάσετε τους χώρους ονομάτων στοιχείων, πρέπει να χρησιμοποιήσετε μία από τις ακόλουθες προσεγγίσεις.

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

$dc = $languages‎ -> lang [ 1 ] - > παιδιά( "http://purl.org/dc/elements/1.1/") ;
echo $dc -> creator ;

Μέθοδος παιδιά()παίρνει έναν χώρο ονομάτων και επιστρέφει θυγατρικά στοιχεία που ξεκινούν με ένα πρόθεμα. Χρειάζονται δύο ορίσματα, το πρώτο από τα οποία είναι ο χώρος ονομάτων XML και το δεύτερο είναι ένα προαιρετικό όρισμα το οποίο έχει ως προεπιλογή ψευδής. Εάν το δεύτερο όρισμα οριστεί σε TRUE, ο χώρος ονομάτων θα αντιμετωπίζεται ως πρόθεμα. Εάν FALSE, τότε ο χώρος ονομάτων θα αντιμετωπίζεται ως χώρος ονομάτων URL.

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

$namespaces = $languages‎ -> getNamespaces (true) ;
$dc = $languages ​​​​ -> lang [ 1 ] -> παιδιά ( ($namespace [ "dc" ] );

echo $dc -> creator ;

Μέθοδος GetNamespaces()επιστρέφει μια σειρά ονομάτων προθεμάτων και τα συσχετισμένα URI τους. Δέχεται μια πρόσθετη παράμετρο η οποία είναι προεπιλεγμένη ψευδής. Αν το ρυθμίσετε όπως αληθής, τότε αυτή η μέθοδος θα επιστρέψει τα ονόματα που χρησιμοποιούνται στους κόμβους γονέα και θυγατρικού. Διαφορετικά, βρίσκει χώρους ονομάτων που χρησιμοποιούνται μόνο στον γονικό κόμβο.

Τώρα μπορείτε να επαναλάβετε τη λίστα των γλωσσών όπως αυτή:

$languages ​​= simplexml_load_file ("languages.xml" );
$ns = $languages‎ -> getNamespaces (true ) ;

foreach ($languages ​​-> lang as $lang ) (
$dc = $lang -> παιδιά ($ns [ "dc" ] );
printf(
"

Το %s εμφανίστηκε στο %d και δημιουργήθηκε από το %s .

" ,
$lang ["όνομα" ],
εμφανίστηκε το $lang ->,
$dc -> δημιουργός
) ;
}

Πρακτικό παράδειγμα - Ανάλυση καναλιού βίντεο από το YouTube

Ας δούμε ένα παράδειγμα που λαμβάνει μια ροή RSS από Κανάλι YouTubeκαι εμφανίζει συνδέσμους προς όλα τα βίντεο από αυτό. Για να το κάνετε αυτό, επικοινωνήστε με την ακόλουθη διεύθυνση:

http://gdata.youtube.com/feeds/api/users/xxx/uploads

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

  • Σύνδεσμος βίντεο
  • Μικρογραφία
  • Ονομα

Θα ξεκινήσουμε αναζητώντας και φορτώνοντας το XML:

$channel = "Όνομα_καναλιού" ;
$url = "http://gdata.youtube.com/feeds/api/users/". $κανάλι. "/uploads" ;
$xml = file_get_contents($url);

$feed = simplexml_load_string ($xml) ;
$ns = $feed -> getNameSpaces ( true ) ;

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

>

>



Τίτλος… >

>

>

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

foreach ($feed -> καταχώρηση ως $entry ) (
$group = $entry -> παιδιά ($ns [ "μέσα" ] ;
$group = $group -> group ;
$thumbnail_attrs = $group -> thumbnail [ 1 ] -> χαρακτηριστικά () ;
$image = $thumbnail_attrs [ "url" ] ;
$player = $group -> player -> χαρακτηριστικά () ;
$link = $player [ "url" ] ;
$title = $group -> title ;
printf( "

" ,
$player, $image, $title);
}

Σύναψη

Τώρα που ξέρετε πώς να το χρησιμοποιήσετε SimpleXMLΓια την ανάλυση δεδομένων XML, μπορείτε να βελτιώσετε τις δεξιότητές σας αναλύοντας διαφορετικές ροές XML με διαφορετικά API. Ωστόσο, είναι σημαντικό να λάβετε υπόψη ότι το SimpleXML διαβάζει ολόκληρο το DOM στη μνήμη, επομένως, εάν αναλύετε ένα μεγάλο σύνολο δεδομένων, μπορεί να εξαντληθεί η μνήμη. Για να μάθετε περισσότερα σχετικά με το SimpleXML, διαβάστε την τεκμηρίωση.


Εάν έχετε οποιεσδήποτε ερωτήσεις, συνιστούμε να χρησιμοποιήσετε το δικό μας

XML για προγραμματιστές PHP

Μέρος 2: Προηγμένες τεχνικές ανάλυσης XML

Τεχνικές ανάλυσης μεγάλων ή πολύπλοκων εγγράφων XML σε PHP5

Σειρά περιεχομένου:

Η PHP5 έχει αυξήσει την ποικιλία των μεθόδων ανάλυσης XML. Ο αναλυτής Expat SAX του James Clark, που βασίζεται πλέον στη βιβλιοθήκη libxml2, δεν είναι πλέον ο μόνος αναλυτής με πλήρη χαρακτηριστικά. Είμαστε ήδη εξοικειωμένοι με τη δυνατότητα ανάλυσης μέσω του DOM σε πλήρη συμμόρφωση με το πρότυπο W3C. Πρόσθετες δυνατότητες προσφέρονται από το SimpleXML, το οποίο καλύψαμε στο Μέρος 1 (βλ.), και το XMLReader, το οποίο είναι πιο κατανοητό και πιο γρήγορο στη χρήση από το SAX. Όλες οι επεκτάσεις XML βασίζονται πλέον στη βιβλιοθήκη libxml2 του έργου GNOME. Αυτή η ενοποιημένη βιβλιοθήκη επιτρέπει σε διαφορετικές επεκτάσεις να αλληλεπιδρούν μεταξύ τους. Αυτό το άρθρο εξετάζει τεχνικές ανάλυσης XML στην PHP5, με έμφαση σε μεγάλα ή πολύπλοκα έγγραφα XML. Μιλάει για τις μεθόδους ανάλυσης και τα κριτήρια για την επιλογή, όταν είναι διαθέσιμη, της βέλτιστης μεθόδου για την ανάλυση διαφόρων τύπων εγγράφων XML.

SimpleXML

Το πρώτο άρθρο αυτής της σειράς παρέχει σημαντικές πληροφορίες σχετικά με την XML και οδηγίες για να ξεκινήσετε με τις διεπαφές προγραμμάτων εφαρμογών (API). Απέδειξε ότι το SimpleXML, όταν συνδυάζεται με το Document Object Model (DOM), είναι ένα ιδανικό εργαλείο για προγραμματιστές που ασχολούνται με απλά, προβλέψιμα και σχετικά συμπαγή έγγραφα XML.

XML και PHP5

Η επεκτάσιμη γλώσσα σήμανσης (XML) μπορεί να ονομαστεί και γλώσσα σήμανσης και μορφή για την αποθήκευση δεδομένων κειμένου. Παρέχει εργαλεία κειμένου για την περιγραφή των δομών δέντρων και την εφαρμογή τους σε πληροφορίες.

Η PHP5 έχει τόσο νέες όσο και ξαναγραμμένες επεκτάσεις για ανάλυση XML. Το SimpleXML, το DOM και ο επεξεργαστής XSLT φορτώνουν ολόκληρο το έγγραφο XML στη μνήμη. Το Simple API για XML (SAX) και το XMLReader είναι αναλυτές που επεξεργάζονται ένα έγγραφο XML κομμάτι προς κομμάτι. Το SAX λειτουργεί με τον ίδιο τρόπο όπως και στην PHP4, αλλά τώρα βασίζεται στη βιβλιοθήκη libxml2 και όχι στο expat. Όσοι είναι εξοικειωμένοι με το DOM από άλλες γλώσσες θα είναι πιο εύκολο να εργαστούν με αυτό στην PHP5 από ό,τι σε προηγούμενες εκδόσεις της PHP.

Βασικά στοιχεία ανάλυσης XML

Υπάρχουν δύο κύριες μέθοδοι ανάλυσης XML: βάσει δέντρων και βάσει ροής. Η μέθοδος δέντρου περιλαμβάνει τη φόρτωση ολόκληρου του εγγράφου XML στη μνήμη. Η δενδρική δομή του αρχείου σάς επιτρέπει να έχετε αυθαίρετη πρόσβαση σε στοιχεία εγγράφου και να επεξεργάζεστε XML. Παραδείγματα αναλυτών δέντρων είναι το DOM και το SimpleXML. Αποθηκεύουν τη δομή δέντρου στη μνήμη σε διαφορετικές αλλά αλληλεπιδρώντες μορφές. Με την ανάλυση ροής, ολόκληρο το έγγραφο δεν φορτώνεται στη μνήμη. ΣΕ σε αυτή την περίπτωσηΟ όρος "ροή" χρησιμοποιείται με την ίδια έννοια όπως όταν περιγράφεται ροή ήχου. Το ίδιο συμβαίνει για τους ίδιους λόγους: τα δεδομένα φτάνουν σε μικρές μερίδες προκειμένου να εξοικονομηθεί εύρος ζώνης και πόροι μνήμης. Με την ανάλυση ροής, μόνο ο κόμβος που αναλύεται είναι διαθέσιμος και η επεξεργασία ολόκληρου του εγγράφου XML είναι αδύνατη. Παραδείγματα αναλυτών ροής είναι τα XMLReader και SAX.

Αναλυτές με τη μέθοδο του δέντρου

Οι αναλυτές δέντρων φορτώνουν ολόκληρο το έγγραφο στη μνήμη, έτσι ώστε η ρίζα να μοιάζει με τον κορμό ενός δέντρου και όλα τα παιδιά, τα εγγόνια και οι πιο μακρινοί απόγονοι και τα χαρακτηριστικά να χρησιμεύουν ως κλαδιά. Ο πιο διάσημος αναλυτής που λειτουργεί χρησιμοποιώντας τη μέθοδο δέντρου είναι το DOM. Το πιο απλό είναι το SimpleXML. Ας εξετάσουμε και τα δύο.

Ανάλυση με χρήση DOM

Το πρότυπο DOM, σύμφωνα με το W3C, είναι «...μια διεπαφή ανεξάρτητη από πλατφόρμα και γλώσσα που επιτρέπει σε προγράμματα και σενάρια να έχουν δυναμική πρόσβαση σε έγγραφα και να επεξεργάζονται το περιεχόμενο, τη δομή και το στυλ τους». Η βιβλιοθήκη libxml2 του έργου GNOME υλοποιεί το DOM, μαζί με όλες τις μεθόδους του, σε C. Δεδομένου ότι όλες οι επεκτάσεις XML PHP5 βασίζονται στο libxml2, διαλειτουργούν πλήρως μεταξύ τους. Αυτή η αλληλεπίδραση βελτιώνει σημαντικά τη λειτουργικότητά τους. Για παράδειγμα, μπορείτε να ανακτήσετε ένα στοιχείο χρησιμοποιώντας τον αναλυτή ροής XMLReader, να το εισαγάγετε στο DOM και να εξαγάγετε τα δεδομένα χρησιμοποιώντας το XPath. Έχουν αποδειχθεί στοιχεία αυτής της ευελιξίας.

Ο αναλυτής DOM λειτουργεί χρησιμοποιώντας τη μέθοδο δέντρου. Είναι εύκολο να κατανοηθεί και να χρησιμοποιηθεί, επειδή η δομή της στη μνήμη μοιάζει με το αρχικό έγγραφο XML. Το DOM επικοινωνεί πληροφορίες στην εφαρμογή δημιουργώντας ένα δέντρο αντικειμένων που αντιγράφει ακριβώς το δέντρο των στοιχείων στο αρχείο XML, έτσι ώστε κάθε στοιχείο XML να χρησιμεύει ως κόμβος στο δέντρο. Το DOM είναι ένα πρότυπο W3C, το οποίο έχει κερδίσει την αναγνώρισή του από τους προγραμματιστές λόγω της συνοχής του με άλλες γλώσσες προγραμματισμού. Εφόσον το DOM δημιουργεί ένα δέντρο ολόκληρου του εγγράφου, καταναλώνει πολλή μνήμη και πολλούς πόρους CPU.

DOM σε δράση

Εάν, λόγω κάποιου περιορισμού, αναγκαστείτε να επιλέξετε έναν μόνο αναλυτή, είναι λογικό να επιλέξετε το DOM, τουλάχιστον λόγω της ευελιξίας του. Το DOM σάς επιτρέπει να συνθέσετε, να τροποποιήσετε, να αποκτήσετε πρόσβαση, να επικυρώσετε και να μετασχηματίσετε έγγραφα XML. Μπορείτε να χρησιμοποιήσετε όλες τις μεθόδους και τις ιδιότητες DOM Οι περισσότερες μέθοδοι DOM δεύτερου επιπέδου υλοποιούνται με την κατάλληλη υποστήριξη ιδιοτήτων. Λόγω της εξαιρετικής ευελιξίας του DOM, τα έγγραφα που αναλύονται μπορεί να είναι εξαιρετικά περίπλοκα. Ωστόσο, να θυμάστε ότι το κόστος της ευελιξίας είναι ότι ολόκληρο το έγγραφο φορτώνεται στη μνήμη.

Το παράδειγμα στη Λίστα 1 χρησιμοποιεί το DOM για την ανάλυση του εγγράφου και την ανάκτηση του στοιχείου χρησιμοποιώντας τη συνάρτηση getElementById. Πριν από την αναφορά στο αναγνωριστικό, το έγγραφο πρέπει να επικυρωθεί ορίζοντας validateOnParse=true . Σύμφωνα με το πρότυπο DOM, αυτό απαιτεί ένα DTD που ορίζει το χαρακτηριστικό ID ως τύπο ID.

Λίστα 1. Χρήση του DOM με ένα απλό έγγραφο
validateOnParse = true; $doc->Load("basic.xml"); echo "Το στοιχείο του οποίου το id είναι το myelement είναι: " . $doc->getElementById("myelement")->tagName . "\n"; ?>

Η συνάρτηση getElementsByTagName() επιστρέφει μια νέα παρουσία της κλάσης DOMNodeList που περιέχει στοιχεία με δεδομένο όνομαετικέτα. Φυσικά, πρέπει να κάνετε κύλιση στη λίστα. Η αλλαγή της δομής του εγγράφου κατά την εργασία με το NodeList που επιστρέφεται από το getElementsByTagName() επηρεάζει το NodeList με το οποίο εργάζεστε (δείτε Λίστα 2). Δεν απαιτείται επαλήθευση σε αυτήν την περίπτωση.

Λίστα 2. Μέθοδος DOM getElementsByTagName
DOMDocument ( DOMNodeList getElementsByTagName(όνομα συμβολοσειράς); )

Το παράδειγμα στη Λίστα 3 χρησιμοποιεί το DOM με XPath.

Λίστα 3. Χρήση DOM και ανάλυση με χρήση XPath
διατήρησηWhiteSpace = ψευδής; $doc->Load("book.xml"); $xpath = νέο DOMXPath($doc); // Ξεκινήσαμε με το ριζικό στοιχείο $query = "//book/chapter/para/informaltable/tgroup/tbody/row/entry[. = "en"]"; $entries = $xpath->query($query); foreach ($entries as $entry) ( echo "Found ($entry->previousSibling->previousSibling->nodeValue)," . " από ($entry->previousSibling->nodeValue)\n"; ) ?>

Έχοντας πει όλα αυτά τα ωραία πράγματα για το DOM, θέλω να δώσω ένα παράδειγμα για το τι δεν πρέπει να κάνετε με το DOM και, στη συνέχεια, στο επόμενο παράδειγμα, να δείξω πώς να το ξεπεράσετε. Η λίστα 4 απεικονίζει τη φόρτωση ενός μεγάλου αρχείου στο DOM μόνο για την εξαγωγή δεδομένων από ένα μεμονωμένο χαρακτηριστικό χρησιμοποιώντας DomXpath.

Καταχώριση 4. Λάθος χρησιμοποιώντας DOMμε το XPath όταν εργάζεστε με ένα μεγάλο έγγραφο XML
load("tooBig.xml"); $xp = νέο DomXPath($dom); $result = $xp->query("/blog/entries/entry[@ID = 5225]/title") ; εκτύπωση $result->item(0)->nodeValue ."\n"; ?>

ΣΕ τελευταίο παράδειγμα(Λίστα 5) Το DOM με XPath χρησιμοποιείται με τον ίδιο τρόπο, μόνο τα δεδομένα μεταβιβάζονται στο XMLReader ένα στοιχείο κάθε φορά χρησιμοποιώντας τη μέθοδο expand(). Αυτό μετατρέπει τον κόμβο που διαβιβάστηκε στο XMLReader σε στοιχείο DOME.

Λίστα 5. Σωστή χρήση DOM με XPath όταν εργάζεστε με ένα μεγάλο έγγραφο XML
open("tooBig.xml"); ενώ ($reader->read()) ( switch ($reader->nodeType) ( case (XMLREADER::ELEMENT): if ($reader->localName == "entry") ( if ($reader->getAttribute( "ID") == 5225) ( $node = $reader->expand(); $dom = new DomDocument(); $n = $dom->importNode($node,true); $dom->appendChild($ n $xp = new DomXpath($dom) = $xp->query("/entry/title");

Ανάλυση χρησιμοποιώντας SimpleXML

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

SimpleXML σε δράση

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

Ο κώδικας στη Λίστα 6 εξάγει την πλοκή της ιστορίας που περιέχεται στο στοιχείο από το παράδειγμα εγγράφου XML

Λίστα 6. Εξαγωγή κομματιού κειμένου
Μεγάλο αμερικανικό μυθιστόρημα Ο Cliff συναντά την Lovely Woman. Ο πιστός σκύλος κοιμάται, αλλά ξυπνάει για να γαυγίσει στον ταχυδρόμο. 4 9 XML; ?>βιβλίο->οικόπεδο; // "Cliff meets Lovely Woman...." ?>

Από την άλλη πλευρά, ίσως χρειαστεί να εξαγάγετε μια διεύθυνση πολλαπλών γραμμών. Όταν ένα μεμονωμένο γονικό στοιχείο έχει πολλαπλές εμφανίσεις ενός θυγατρικού στοιχείου, χρησιμοποιείται η τεχνική κανονικής επανάληψης. Αυτή η λειτουργία παρουσιάζεται στην Λίστα 7.

Λίστα 7. Ανάκτηση πολλαπλών παρουσιών ενός στοιχείου
Μεγάλο αμερικανικό μυθιστόρημα Ο Cliff συναντά την Lovely Woman. 4 9 Ο άνθρωπος δαγκώνει σκύλο 22 3 XML; ?> βιβλίο ως $book) ( echo $book->plot, "
"; } ?

Εκτός από την ανάγνωση των ονομάτων στοιχείων και των τιμών τους, το SimpleXML μπορεί να έχει πρόσβαση σε χαρακτηριστικά στοιχείων. Η λίστα 8 έχει πρόσβαση στις ιδιότητες του στοιχείου. Αυτό γίνεται με τον ίδιο ακριβώς τρόπο όπως η πρόσβαση στα στοιχεία ενός πίνακα.

Λίστα 8. Επίδειξη των χαρακτηριστικών στοιχείων πρόσβασης SimpleXML
Μεγάλο αμερικανικό μυθιστόρημα Ο Cliff συναντά την Lovely Woman. 4 9 Ο άνθρωπος δαγκώνει σκύλο Ο δημοσιογράφος επινοεί μια ιστορία που κέρδισε βραβεία. 22 3 XML; ?>book->success as $success) ( switch((string) $success["type"]) ( case "bestseller": echo $success, " months on bestseller list
"; διάλειμμα; περίπτωση "bookclubs": echo $success, " listings clubclub
"; σπάσιμο; ) ) ?>

Το τελευταίο παράδειγμα (δείτε Λίστα 9) χρησιμοποιεί SimpleXML και DOM με την επέκταση XMLReader. Με το XMLReader, τα δεδομένα μεταφέρονται διαδοχικά, ένα στοιχείο κάθε φορά, χρησιμοποιώντας τη μέθοδο expand(). Με αυτήν τη μέθοδο, ο κόμβος που μεταβιβάζεται στο XMLReader μπορεί να μετατραπεί σε στοιχείο DOME και στη συνέχεια να περάσει στο SimpleXML.

Καταχώριση 9. Χρήση SimpleXML και DOM με την επέκταση XMLReader για την ανάλυση ενός μεγάλου εγγράφου XML
open("tooBig.xml"); ενώ ($reader->read()) ( switch ($reader->nodeType) ( case (XMLREADER::ELEMENT): if ($reader->localName == "entry") ( if ($reader->getAttribute( "ID") == 5225) ( $node = $reader->expand(); $dom = new DomDocument(); $n = $dom->importNode($node,true); $dom->appendChild($ n); $sxe = simplexml_import_dom($n echo $sxe->title) ) ?>

Αναλυτές ροής

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

Ανάλυση με χρήση XMLReader

Το XMLReader είναι αναλυτής ροήςο τύπος που ονομάζεται συχνά δρομέας ή αναλυτής έλξης. Το XMLReader αντλεί πληροφορίες από ένα έγγραφο XML κατά παραγγελία. Βασίζεται σε ένα API που προέρχεται από το C# XmlTextReader. Στην PHP 5.1 είναι ενεργοποιημένο και ενεργοποιημένο από προεπιλογή και βασίζεται στη βιβλιοθήκη libxml2. Πριν από την PHP 5.1, η επέκταση XMLReader δεν ήταν ενεργοποιημένη από προεπιλογή, αλλά ήταν διαθέσιμη στο PECL (βλ. ). Το XMLReader υποστηρίζει χώρους ονομάτων και επικύρωση, συμπεριλαμβανομένων των DTD και Relaxed NG.

Το XMLReader σε δράση

Ως αναλυτής ροής, το XMLReader είναι κατάλληλο για εργασία με μεγάλα έγγραφα XML. Είναι πολύ πιο εύκολο και συνήθως πιο γρήγορο στον προγραμματισμό από το SAX. Αυτός είναι ο καλύτερος αναλυτής ροής.

Το ακόλουθο παράδειγμα (Λίστα 10) αναλύει ένα μεγάλο έγγραφο XML χρησιμοποιώντας το XMLReader.

Λίστα 10. XMLReader με μεγάλο αρχείο XML
open("tooBig.xml"); ενώ ($reader->read()) ( switch ($reader->nodeType) ( case (XMLREADER::ELEMENT): if ($reader->localName == "entry") ( if ($reader->getAttribute( "ID") == 5225) ( while ($reader->read()) ( if ($reader->nodeType == XMLREADER::ELEMENT) ( if ($reader->localName == "title") ( $ reader->read( echo $reader->value ) if ($reader->localName == "entry") ( break; ) ) ) ?>

Ανάλυση με SAX

Το απλό API για XML (SAX) είναι ένας αναλυτής ροής. Τα συμβάντα σχετίζονται με το έγγραφο XML που διαβάζεται, επομένως το SAX προγραμματίζεται σε στυλ επιστροφής κλήσης. Υπάρχουν συμβάντα για ετικέτες ανοίγματος και κλεισίματος στοιχείων, οντότητες και σφάλματα ανάλυσης. Κύριος λόγοςΟ λόγος για τη χρήση ενός αναλυτή SAX αντί για έναν XMLReader είναι ότι ο αναλυτής SAX είναι μερικές φορές πιο αποτελεσματικός και συνήθως είναι πιο οικείος. Ένα σημαντικό μειονέκτημα είναι ότι ο κώδικας για τον αναλυτή SAX είναι πιο περίπλοκος και πιο δύσκολος στην εγγραφή από ό,τι για το XMLReader.

Το SAX σε δράση

Το SAX θα πρέπει να είναι εξοικειωμένο σε όσους έχουν εργαστεί με XML σε PHP4 και η επέκταση SAX στην PHP5 είναι συμβατή με την έκδοση που έχουν συνηθίσει. Δεδομένου ότι είναι αναλυτής ροής, χειρίζεται καλά μεγάλα αρχεία, αλλά δεν το κάνει καλύτερη επιλογήαπό το XMLReader.

Η λίστα 11 δείχνει ένα παράδειγμα επεξεργασίας ενός μεγάλου εγγράφου XML με τον αναλυτή SAX.

Λίστα 11. Χρήση SAX για την ανάλυση ενός μεγάλου αρχείου XML
χτύπημα = αληθινό;
) else ( $this->hit = false; ) ) if ($this->hit && $elementname == "title") ($this->titleHit = true; ) else ($this->titleHit =false; ) ) //ανάκληση για το τέλος κάθε στοιχείου συνάρτηση endElement($parser_object, $elementname) ( ) //ανάκληση για το περιεχόμενο κάθε στοιχείου συνάρτηση contentHandler($parser_object,$data) ( if ($this->titleHit) ( echo περικοπή ($data)."

Σύναψη

"; ) ) //Λειτουργία για να ξεκινήσει η ανάλυση όταν οριστούν όλες οι τιμές //και το αρχείο είναι ανοιχτό η συνάρτηση doParse($parser_object) (αν (!($fp = fopen("tooBig.xml", "r" ))). ($ PARSER_OBJECT, $ PARSER_OBJECT, "StARTELEMENT");

Η PHP5 προσφέρει μια μεγάλη ποικιλία μεθόδων ανάλυσης. Η ανάλυση DOM, η οποία είναι πλέον πλήρως συμβατή με το πρότυπο W3C, είναι μια γνωστή επιλογή κατάλληλη για πολύπλοκα αλλά σχετικά συμπαγή έγγραφα. Το SimpleXML είναι ένας τρόπος εργασίας με απλά, ελαφριά έγγραφα και ο αναλυτής ροής XMLReader, ο οποίος είναι ελαφρύτερος και ταχύτερος από το SAX, προτιμάται για πολύ μεγάλα έγγραφα. Έχω δει πολλούς αναλυτές xml, αλλά δεν έχω αγγίξει τον προγραμματισμό ιστού. Τώρα θέλω να μάθω και να μάθω μαζί σας πώς να το κάνωαπλό xml

αναλυτής σε php.

Γιατί; Απαραίτητος! Όχι, στην πραγματικότητα: τα αρχεία xml είναι πολύχρήσιμο πράγμα

Υποθέτουμε ότι γνωρίζουμε τι είναι το XML και δεν θα το περιγράψουμε εδώ. Λοιπόν, αν δεν ξέρουμε, μπορούμε εύκολα να μάθουμε εδώ: http://ru.wikipedia.org/wiki/XML

Κατά την αναζήτηση τρόπων ανάλυσης XML στην PHP, ανακάλυψα ένα απλό σύνολο συναρτήσεων στην PHP για εργασία με αρχεία XML που ονομάζονται "XML Parser Functions". Η ανάλυση ξεκινά με την προετοιμασία του αναλυτή καλώντας τη συνάρτηση xml_parser_create:

$xml_parser = xml_parser_create();

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

xml_set_element_handler($xml_parser, "startElement", "endElement");

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

Οι ίδιες οι συναρτήσεις startElement και endElement λαμβάνουν αρκετές παραμέτρους σύμφωνα με την τεκμηρίωση της php:

Αλλά πώς να διαβάσετε δεδομένα από ένα αρχείο; Δεν έχουμε δει ακόμη μια παράμετρο για αυτό σε καμία από τις συναρτήσεις! Και περισσότερα για αυτό αργότερα: η ανάγνωση του αρχείου στηρίζεται στους ώμους του προγραμματιστή, δηλ. θα πρέπει να χρησιμοποιήσουμε τυπικά χαρακτηριστικάγια εργασία με αρχεία:

Άνοιξε το αρχείο. Τώρα πρέπει να το διαβάσετε γραμμή προς γραμμή και να τροφοδοτήσετε τις γραμμές ανάγνωσης στη συνάρτηση xml_parse:

Σφάλμα XML: ".xml_error_string(xml_get_error_code($xml_parser)); echo "στη γραμμή ".xml_get_current_line_number($xml_parser); break; ) ) ?>

Εδώ σημειώνουμε δύο πολύ σημαντικά πράγματα. Το πρώτο είναι ότι η συνάρτηση xml_parse πρέπει να περάσει τη σημαία ανάγνωσης στην τρίτη παράμετρο τελευταία γραμμή(αληθές - αν η γραμμή είναι η τελευταία, ψευδής - αν όχι). Το δεύτερο πράγμα είναι ότι, όπως σε κάθε επιχείρηση, εδώ πρέπει να προσέχουμε για λάθη. Οι συναρτήσεις xml_get_error_code και xml_error_string είναι υπεύθυνες για αυτό. Η πρώτη συνάρτηση λαμβάνει τον κωδικό σφάλματος και η δεύτερη, με βάση τον κωδικό που έλαβε, επιστρέφει μια περιγραφή κειμένου του σφάλματος. Το τι συμβαίνει ως αποτέλεσμα ενός σφάλματος θα συζητηθεί αργότερα. Όχι λιγότερο χρήσιμο χαρακτηριστικόΤο xml_get_current_line_number θα μας πει τον αριθμό της τρέχουσας γραμμής που υποβάλλεται σε επεξεργασία στο αρχείο.

Και όπως πάντα, πρέπει να ελευθερώσουμε τους πόρους που καταλαμβάνει το σύστημα. Για ανάλυση XML, αυτή είναι η συνάρτηση xml_parser_free:

xml_parser_free($xml_parser);

Εδώ εξετάσαμε τις κύριες λειτουργίες. Ήρθε η ώρα να τους δούμε σε δράση. Για αυτό κατέληξα σε ένα αρχείο xml με πολύ απλή δομή:




123

71234567890

Ας ονομάσουμε αυτό το αρχείο data.xml και ας προσπαθήσουμε να το αναλύσουμε χρησιμοποιώντας τον ακόλουθο κώδικα:

Στοιχείο: $name
"? // εμφανίζει το χαρακτηριστικό name και την τιμή του ηχώ "Χαρακτηριστικό: ".$attr." = ".$value."
"; ) ) συνάρτηση endElement($parser, $name) ( καθολική $depth; $depth--; // μείωση του βάθους ) $depth = 0; $file = "data.xml"; $xml_parser = xml_parser_create(); xml_set_element_handler ($xml_parser, "startElement", "endElement" if (!($fp = fopen($file, "r"))) (die("δεν μπόρεσε να ανοίξει την είσοδο XML"); ) while ($data =); fgets ($fp)) ( if (!xml_parse($xml_parser, $data, feof($fp))) ( echo "
Σφάλμα XML: "; echo xml_error_string(xml_get_error_code($xml_parser)); echo " at line ".xml_get_current_line_number($xml_parser); break; ) ) xml_parser_free($xml_parser); ?>

Ως αποτέλεσμα του απλούστερου σεναρίου που αναπτύξαμε, το πρόγραμμα περιήγησης εμφάνισε τις ακόλουθες πληροφορίες στο παράθυρό του:

Στοιχείο: ROOT
Στοιχείο: ΠΛΗΡΟΦΟΡΙΕΣ
Ιδιότητα: WHO = δικό μου
Στοιχείο: ΔΙΕΥΘΥΝΣΗ

Ιδιότητα: KVARTIRA = 12
Χαρακτηριστικό: DOM = 15
Στοιχείο: ΤΗΛΕΦΩΝΟ

Ας προσπαθήσουμε να καταστρέψουμε το αρχείο XML αντικαθιστώντας την ετικέτα Επί και αφήνοντας την ετικέτα κλεισίματος ίδια:

Στοιχείο: ROOT
Στοιχείο: ΠΛΗΡΟΦΟΡΙΕΣ
Ιδιότητα: WHO = δικό μου
Στοιχείο: ΔΙΕΥΘΥΝΣΗ
Ιδιότητα: ULICA = ο δρόμος μου!!
Ιδιότητα: KVARTIRA = 12
Χαρακτηριστικό: DOM = 15
Στοιχείο: ΤΗΛΕΦΩΝΟ

Σφάλμα XML: Μη αντιστοίχιση ετικέτας στη γραμμή 5

Εκπληκτική επιτυχία! Τα μηνύματα λάθους λειτουργούν! Και αρκετά κατατοπιστικό.

Ε, ξέχασα κάτι ακόμα... Δεν εμφανίσαμε το κείμενο που περιέχεται στις ετικέτες διεύθυνσης και τηλεφώνου. Διορθώνουμε το ελάττωμά μας - προσθέτουμε ένα πρόγραμμα χειρισμού κειμένου χρησιμοποιώντας τη συνάρτηση xml_set_character_data_handler:

xml_set_character_data_handler($xml_parser, 'stringElement');

Και προσθέστε την ίδια τη λειτουργία χειριστή στον κώδικα:

0) ( καθολική $depth; echo str_repeat(" ", $depth * 3); // echo εσοχής "String: ".$str."
"; // εκτυπώστε τη συμβολοσειρά ) ) ?>

Τώρα ας δούμε την έξοδο:

Στοιχείο: ROOT
Στοιχείο: ΠΛΗΡΟΦΟΡΙΕΣ
Ιδιότητα: WHO = δικό μου
Στοιχείο: ΔΙΕΥΘΥΝΣΗ
Ιδιότητα: ULICA = ο δρόμος μου!!
Ιδιότητα: KVARTIRA = 12
Χαρακτηριστικό: DOM = 15
Χορδή: 123
Στοιχείο: ΤΗΛΕΦΩΝΟ
Συμβολοσειρά: +71234567890

ΓΙΑ! Τώρα βγήκαν όλα!

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

Αχ, το βρήκα! Αποδεικνύεται ότι υπάρχει επίσης μια συνάρτηση xml_parser_set_option:

xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0);

Με αυτήν την κλήση ακυρώνουμε την εκτύπωση ονομάτων χαρακτηριστικών και ονομάτων ετικετών με κεφαλαία γράμματα:

Στοιχείο: ρίζα
Στοιχείο: πληροφορίες
Ιδιότητα: ποιος = δικός μου
Στοιχείο: διεύθυνση
Ιδιότητα: ulica = ο δρόμος μου!!
Ιδιότητα: kvartira = 12
Ιδιότητα: dom=15
Χορδή: 123
Στοιχείο: τηλέφωνο
Συμβολοσειρά: +71234567890

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

→ Σε τι χρειάζονται οι αναλυτές XML και πώς μπορούν να είναι χρήσιμοι

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

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

Γενικά, ένα έγγραφο XML είναι ένα απλό αρχείο κειμένου στο οποίο αποθηκεύεται η απαραίτητη δομή δεδομένων χρησιμοποιώντας ειδικές συντακτικές δομές (που ονομάζονται «ετικέτες»). Αυτό σας επιτρέπει να αποθηκεύετε πληροφορίες όχι ως συνεχή πίνακα, αλλά με τη μορφή ιεραρχικά συσχετιζόμενων τμημάτων. Επειδή αρχεία κειμένουπολύ εύκολο να δημιουργηθούν και να μεταδοθούν μέσω του δικτύου, είναι εξαιρετικά με βολικό τρόποαποθήκευσης πληροφοριών και χρησιμοποιούνται ευρέως στη δημιουργία πολύπλοκων κατανεμημένες εφαρμογές.

Αλλά η ευελιξία του κειμένου Μορφή XMLμετατρέπεται σε μια πολύ προφανή ταλαιπωρία - πριν εξαγάγετε δεδομένα από ένα έγγραφο, πρέπει πραγματικά να παλέψετε τεχνολογίακείμενο και τον προσδιορισμό της δομής του. Πραγματοποίηση όλων απαραίτητες διαδικασίεςΤο χειροκίνητο είναι μια πολύ μη τετριμμένη εργασία και θα απαιτήσει σημαντική προσπάθεια. Ένας από τους τυπικούς μηχανισμούς που διευκολύνει τη ζωή των προγραμματιστών είναι οι αναλυτές.

Τι είναι αυτό; Ο αναλυτής XML είναι ένα πρόγραμμα σχεδιασμένο για την ανάλυση περιεχομένου έγγραφο κειμένου, το οποίο συμμορφώνεται με την προδιαγραφή XML. Αναλαμβάνει όλη τη «βρώμικη» δουλειά: τη λήψη γενικές πληροφορίεςσχετικά με το έγγραφο, ανάλυση του κειμένου, αναζήτηση σε αυτό για κατασκευές υπηρεσίας (στοιχεία, χαρακτηριστικά, οντότητες κ.λπ.), έλεγχος συμμόρφωσης με συντακτικούς κανόνες και επίσης παροχή διεπαφής για πρόσβαση στο έγγραφο. Ως αποτέλεσμα, τα δεδομένα που έχουν εξαχθεί προσεκτικά θα μεταφερθούν εφαρμογή χρήστη, το οποίο μπορεί να μην γνωρίζει απολύτως τίποτα για το τι είναι η XML.

Ο αναλυτής μπορεί να υλοποιηθεί ως ξεχωριστός μονάδα λογισμικούή ένα στοιχείο ActiveX, μπορεί να συνδεθεί στην εφαρμογή μέσω ειδικών βιβλιοθηκών κλάσεων κατά τη μεταγλώττιση ή το χρόνο εκτέλεσης. Οι αναλυτές χωρίζονται σε επικυρωτικούς και μη επικυρωτικούς. Οι πρώτοι μπορούν να ελέγξουν τη δομή του εγγράφου με βάση DTD ή σχήματα δεδομένων, ενώ οι δεύτεροι δεν ενδιαφέρονται για αυτό - και επομένως, κατά κανόνα, έχουν μικρότερο μέγεθος. Πολλοί από τους σύγχρονους αναλυτές είναι «φορτωμένοι» με πολλούς πρόσθετα χαρακτηριστικά(εκτεταμένος χειρισμός σφαλμάτων, προσθήκη και επεξεργασία δεδομένων), γεγονός που τα καθιστά πιο βολικά στη χρήση, αν και αυξάνει το μέγεθος των προγραμμάτων. Σχεδόν όλοι οι κοινοί αναλυτές υποστηρίζουν επίσης έναν αριθμό σημαντικών προτύπων XML (XSLT, σχήματα δεδομένων, χώροι ονομάτων, XPath, κ.λπ.) - ή παρέχονται σε συνδυασμό με αναλυτές άλλων γλωσσών που προέρχονται από αυτό.

Εάν αντιλαμβάνεστε τη χρησιμότητα ενός αναλυτή XML, τότε ήρθε η ώρα να ξεκινήσετε πρακτικά πειράματα. Πού μπορώ να τα πάρω; Ειδικά προβλήματαΗ αναζήτηση του κατάλληλου λογισμικού δεν θα πρέπει να αποτελεί πρόβλημα: το Διαδίκτυο είναι γεμάτο από ελεύθερα διανεμημένους αναλυτές γραμμένους σε όλα τα είδη γλωσσών προγραμματισμού, που εργάζονται σε όλες τις πλατφόρμες και διαθέτουν τα περισσότερα διαφορετικά χαρακτηριστικάκαι σκοπός.

Το πιο συνηθισμένο και γνωστό είναι το Expat parser, γραμμένο από τον James Clark, έναν από τους δημιουργούς της προδιαγραφής XML. Υλοποιείται στη γλώσσα προγραμματισμού C++ και διανέμεται με πηγαίος κώδικας. Παρεμπιπτόντως, η υποστήριξη αυτής της γλώσσας σήμανσης σε γνωστά περιβάλλοντα όπως η PHP και η Perl υλοποιείται ακριβώς στη βάση της. Ένας άλλος κοινός αναλυτής είναι ο Xerces, διαθέσιμος στο Apache XML Project (που υλοποιείται στο Γλώσσες Javaκαι C++). Μπορείτε να βρείτε πολλούς αναλυτές για C++, Perl και Python. Τα περισσότερα από αυτά είναι γραμμένα σε Java και είναι κατάλληλα για οποιαδήποτε πλατφόρμα εξοικειωμένη με την Java. Στην άκρη δεν στάθηκαν ούτε οι ηγέτες της αγοράς (Microsoft, Oracle, Sun), που διακρίνονται πάντα για την κλίμακα και τη μνημειακότητά τους. Κυκλοφόρησαν πιο «βαριά» και πακέτα λειτουργιών, που περιέχουν, εκτός από τους ίδιους τους αναλυτές, πολλά πρόσθετα βοηθητικά προγράμματα, διευκολύνοντας τη ζωή των προγραμματιστών.

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



Συνιστούμε να διαβάσετε

Κορυφή