4. Φυσικές Δομές (Physical Structures)

 

Ένα XML έγγραφο αποτελείται από μια ή από πολλές μονάδες αποθήκευσης. Αυτές καλούνται οντότητες(entities): έχουν όλες περιεχόμενο ((content) εκτός από την οντότητα εγγράφου) και είναι όλες προσδιοριστέες από ένα όνομα (name). Κάθε XML έγγραφο έχει μια οντότητα που καλείται οντότητα εγγράφου, η οποία λειτουργεί ως σημείο αρχής στον XML επεξεργαστή και μπορεί να περιέχει ολόκληρο το έγγραφο.

 

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

 

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

 

Οι αναλυμένες οντότητες υλοποιούνται από ένα όνομα χρησιμοποιώντας αναφορές οντοτήτων, ενώ οι μη αναλυμένες από ένα όνομα που δίνεται από τις τιμές των χαρακτηριστικών ENTITY ή ENTITIES.

 

Οι γενικές οντότητες είναι οντότητες που χρησιμοποιούνται μέσα στο περιεχόμενο του κειμένου. Σ΄αυτήν την προδιαγραφή, οι γενικές οντότητες αναφέρονται συχνά με τον αναρμόδιο όρο entity όταν δεν οδηγεί σε κάποια αμφιβολία. Οι οντότητες παραμέτρων είναι αναλυμένες οντότητες για χρήση μέσα σε ένα DTD.Αυτοί οι δυο τύποι οντοτήτων χρησιμοποιούν αναφορές διαφορετικού τύπου και αναγνωρίζονται σε διαφορετικό περιβάλλον. Ακόμη απασχολούν διαφορετικά namespaces’ μια οντότητα παραμέτρων και  μια γενική οντότητα με το ίδιο όνομα είναι δυο ευδιάκριτες οντότητες.

   

4.1 Αναφορές Χαρακτήρων και Οντοτήτων (Character and Entity References)

 

Μια αναφορά χαρακτήρα αναφέρεται σε έναν συγκεκριμένο χαρακτήρα του συνόλου χαρακτήρων του ISO/IEC 10646, για παράδειγμα σε ένα όχι άμεσα προσβάσιμο από τις διαθέσιμες συσκευές εισόδου.

 

Περιορισμός Well-formed: Νόμιμος Χαρακτήρας

Οι χαρακτήρες που αναφέρονται χρησιμοποιώντας αναφορές χαρακτήρων πρέπει να ταιριάζουν στο προϊόν για char.

 

 Αν η αναφορά χαρακτήρα ξεκινά με “&#x”, τα ψηφία και τα γράμματα στο τέλος ; παρέχουν μια δεκαεξαδική αναπαράσταση του κώδικα χαρακτήρων του ISO/IEC 10646. Αν ξεκινά με “&#x”, τα ψηφία  στο τέλος ; παρέχουν μια δεκαδική αναπαράσταση του κώδικα χαρακτήρων.

 

Μια αναφορά οντότητας αναφέρεται στο περιεχόμενο μιας ονομαστικής οντότητας. Οι αναφορές σε αναλυμένες γενικές οντότητες χρησιμοποιούν ως χαρακτήρες αρχής και τέλους τους (&) και (;). Οι αναφορές παραμέτρων οντοτήτων χρησιμοποιούν τους (%) και (;).

 

Περιορισμός  Well-formed: Δηλωμένες Οντότητες

Σε ένα έγγραφο με κανένα DTD, ένα έγγραφο με μόνο ένα εσωτερικό υποσύνολο που δεν περιέχει καμία αναφορά παραμέτρων οντοτήτων, ή σε ένα έγγραφο με “standalone = ‘yes’ ”,  το name που δίνεται στην αναφορά οντοτήτων πρέπει να ταιριάζει με αυτό σε μια δήλωση οντοτήτων, εκτός από τα well-formed έγγραφα που δεν υποχρεούνται να δηλώνουν μια από τις παρακάτω οντότητες: amp, lt, gt, apos, quot. Η δήλωση των παραμέτρων οντοτήτων πρέπει να προηγείται οποιασδήποτε αναφοράς σε αυτές. Παράλληλα, η δήλωση μιας γενικής οντότητας πρέπει να προηγείται οποιασδήποτε αναφοράς σε αυτήν, η οποία εμφανίζεται με μια default τιμή σε μια δήλωση λίστας χαρακτηριστικών. Αν οι οντότητες δηλώνονται σε εξωτερικά υποσύνολα ή σε εξωτερικές παραμέτρους οντοτήτων ένας μη έγκυρος επεξεργαστής δεν είναι υποχρεωμένος να  διαβάζει και να επεξεργάζεται αυτές τις δηλώσεις. Για αυτά τα έγγραφα ο κανόνας ότι μια οντότητα πρέπει να δηλώνεται είναι ένας well-formed περιορισμός μόνο αν ισχύει standalone = ‘yes’.

 

Περιορισμός Valid: Δηλωμένες Οντότητες

Σε ένα έγγραφο με εξωτερικά υποσύνολα ή εξωτερικές παραμέτρους οντοτήτων με “standalone = ‘no’ ”, το name που δίνεται στην αναφορά οντοτήτων πρέπει να ταιριάζει με αυτό σε μια δήλωση οντοτήτων. Τα valid έγγραφα πρέπει να δηλώνουν τις οντότητες amp, lt, gt, apos, quot. Η δήλωση των παραμέτρων οντοτήτων πρέπει να προηγείται οποιασδήποτε αναφοράς  σε αυτές. Παράλληλα, η δήλωση μιας γενικής οντότητας πρέπει να προηγείται οποιασδήποτε αναφοράς σε αυτήν, η οποία εμφανίζεται με μια default τιμή σε μια δήλωση λίστας χαρακτηριστικών.

 

Περιορισμός  Well-formed: Αναλυμένη Οντότητα

Μια αναφορά οντότητας δεν πρέπει να περιλαμβάνει το όνομα μιας μη αναλυμένης οντότητας. Οι μη αναλυμένες οντότητες πρέπει να αναφέρονται μόνο σε αποδόσεις τιμών δηλωμένες του τύπου ENTITY ή ENTITIES.

 

Περιορισμός  Well-formed: Χωρίς Επιστροφή

Μια αναλυμένη οντότητα δεν πρέπει να περιλαμβάνει περιοδικά επαναλαμβανόμενες αναφορές στον εαυτό της, είτε άμεσα είτε έμμεσα.

 

Περιορισμός  Well-formed: Σε DTD

Οι αναφορές παραμέτρων οντοτήτων μπορούν να εμφανίζονται μονάχα σε DTD.

 

Παραδείγματα αναφορών χαρακτήρων και οντοτήτων:

Type <key>less-than</key> (&#x3C;) to save options.
This document was prepared on &docdate; and
is classified &security-level;.

 

 

Παράδειγμα αναφοράς παραμέτρου οντοτήτων :

 

<!-- declare the parameter entity "ISOLat2"... -->
<!ENTITY % ISOLat2
SYSTEM "http://www.xml.com/iso/isolat2-xml.entities" >
<!-- ... now reference it. -->
%ISOLat2;

 

4.2 Δηλώσεις Οντοτήτων (Entity Declarations)

 

Οι οντότητες δηλώνονται ως εξής:

 

Entity Declaration

[70]

EntityDecl

::=

GEDecl | PEDecl

[71]

GEDecl

::=

'<!ENTITY' S Name S EntityDef S? '>'

[72]

PEDecl

::=

'<!ENTITY' S '%' S Name S PEDef S? '>'

[73]

EntityDef

::=

EntityValue | (ExternalID NDataDecl?)

[74]

PEDef

::=

EntityValue | ExternalID

 

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

 

4.2.1 Εσωτερικές Οντότητες (Internal Entities)

Αν ο ορισμός της οντότητας είναι ένα EntityValue, η καθορισμένη οντότητα καλείται εσωτερική οντότητα. Δεν υπάρχει ξεχωριστό αντικείμενο φυσικής αποθήκευσης και το περιεχόμενο της οντότητας δίνεται στην δήλωση.

Η εσωτερική οντότητα είναι μια αναλυμένη οντότητα.

Παράδειγμα δήλωσης εσωτερικής οντότητας:

<!ENTITY Pub-Status "This is a pre-release of the
specification.">

 

4.2.2 Εξωτερικές Οντότητες (External Entities)

Οι εξωτερικές οντότητες δηλώνονται ως εξής:

External Entity Declaration

[75]

ExternalID

::=

'SYSTEM' S SystemLiteral

 

 

 

 

| 'PUBLIC' S PubidLiteral S SystemLiteral

 

[76]

NdataDecl

::=

S 'NDATA' S Name

[

VC: Notation Declared ]

 

Αν υπάρχει το NdataDecl, αυτή είναι μια γενική μη αναλυμένη οντότητα, διαφορετικά είναι αναλυμένη οντότητα.

Περιορισμός Valid: Δήλωση Σχολίου

Το name πρέπει να ταιριάζει με το δηλωμένο όνομα του σχολίου.

SystemLiteral καλείται ο αναγνωριστής οντοτήτων του συστήματος. Είναι μια URI που χρησιμοποιείται για να ανακτήσει την οντότητα. Ο χαρακτήρας (#) και ο προσδιοριστής τεμαχίου χρησιμοποιούνται συχνά με τα URI και αποτελούν, όχι όμως τυπικά, μέρος τους. Ο XML επεξεργαστής μπορεί να επισημάνει λάθος εάν ο προσδιοριστής τεμαχίου αποτελεί μέρος του αναγνωριστή συστήματος. Τα αναφορικά URI είναι σχετικά με τη δήλωση της πηγής μέσα στην οποία πραγματοποιείται η δήλωση οντοτήτων. Τότε τα URI είναι σχετικά με την οντότητα των εγγράφων, με την οντότητα που περιέχει εξωτερικά DTD υποσύνολα ή με άλλες εξωτερικές παραμέτρους οντοτήτων.

Ένας XML επεξεργαστής μπορεί να χειριστεί έναν χαρακτήρα που δεν είναι ASCII μέσα σε ένα URI αναπαριστώντας τον χαρακτήρα UTF-8 ως ένα ή περισσότερα bytes, και μετά αποφεύγοντας αυτά τα bytes με έναν URI μηχανισμό escaping (π.χ. μετατρέποντας κάθε byte σε %HH, όπου ΗΗ είναι το δεκαεξαδικό σχόλιο της τιμής του byte.

Επιπρόσθετα σε έναν  αναγνωριστή συστήματος, ο εξωτερικός αναγνωριστής περιλαμβάνει και έναν κοινό αναγνωριστή. Ο επεξεργαστής προσπαθώντας να ανακτήσει τα περιεχόμενα της οντότητας μπορεί να χρησιμοποιήσει τον κοινό αναγνωριστή για να προσπαθήσει να παράγει ένα εναλλακτικό URI. Αν ωστόσο δεν μπορέσει να το κάνει αυτό, μπορεί να χρησιμοποιήσει τα προκαθορισμένα URI που υπάρχουν στο αληθινό σύστημα. Πριν γίνει η προσπάθεια για οποιοδήποτε συνταίριασμα, όλα τα String του «λευκού κενού» στον κοινό αναγνωριστή πρέπει να κανονικοποιηθούν σε χαρακτήρες μονού κενού (#x20), καθώς και τα πρώτα και τα τελευταία κενά να απομακρυνθούν.

Παραδείγματα δηλώσεων εξωτερικών οντοτήτων:

 

<!ENTITY open-hatch
SYSTEM "http://www.textuality.com/boilerplate/OpenHatch.xml">
<!ENTITY open-hatch
PUBLIC "-//Textuality//TEXT Standard open-hatch boilerplate//EN"
"http://www.textuality.com/boilerplate/OpenHatch.xml">
<!ENTITY hatch-pic
SYSTEM "../grafix/OpenHatch.gif"
NDATA gif >

 

4.3 Αναλυμένες Οντότητες (Parsed Entities)

4.3.1 Η Δήλωση Κειμένου(The Text Declaration)

Οι εξωτερικές αναλυμένες οντότητες μπορούν να ξεκινήσουν με μια δήλωση κειμένου.

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

4.3.2 Well-formed Αναλυμένες Οντότητες (Well- Formed Parsed Entities)

Η οντότητα του εγγράφου είναι well-formed αν ταιριάζει στο προϊόν που καλείται document. Μια εξωτερικά αναλυμένη γενική οντότητα είναι well-formed αν ταιριάζει στο προϊόν που καλείται extParsedEnt. Μια εξωτερική παράμετρος οντοτήτων είναι well-formed αν ταιριάζει στο προϊόν που καλείται extPE.

 

Μια εσωτερικά αναλυμένη γενική οντότητα είναι well-formed αν το κείμενο αντικατάστασής της ταιριάζει με το προϊόν που ονομάζεται content. Όλες οι εσωτερικές παράμετροι οντοτήτων είναι εξ΄ορισμού well-formed.

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

 

4.3.3 Κωδικοποίηση Χαρακτήρων στις Οντότητες (Character Encoding in Entities)

Κάθε εξωτερικά αναλυμένη οντότητα μπορεί να χρησιμοποιήσει διαφορετικές κωδικοποιήσεις για τα χαρακτηριστικά της. Όλοι οι XML επεξεργαστές θα πρέπει να είναι ικανοί να διαβάζουν οντότητες και σε UTF-8 και σε UTF-16. 

Οι οντότητες που κωδικοποιούνται σε UTF-16 ξεκινούν με το Byte Order Mask όπως περιγράφεται από το ISO/IEC 10646 Annex E και Unicode Appendix B. Αυτή είναι μια υπογραφή κωδικοποίησης και όχι μέρος του markup ή των χαρακτήρων δεδομένων στο XML έγγραφο. Οι XML επεξεργαστές θα πρέπει να είναι ικανοί να χρησιμοποιούν αυτόν το χαρακτήρα για να διαφοροποιούν τα κωδικοποιημένα έγγραφα σε UTF-8 και UTF-16.

Παρ’ όλο που οι XML επεξεργαστές απαιτείται να διαβάζουν οντότητες σε UTF-8 και UTF-16 κωδικοποιήσεις, είναι γνωστό ότι υπάρχουν στον κόσμο και άλλες κωδικοποιήσεις και μπορεί να είναι επιθυμητό από τους XML επεξεργαστές να διαβάζουν οντότητες που τις χρησιμοποιούν. Οι αναλυμένες οντότητες που αποθηκεύονται σε μια κωδικοποίηση εκτός των UTF-8 και UTF-16, πρέπει να ξεκινούν με μια δήλωση κειμένου που να περιέχει μια κωδικοποιημένη δήλωση.

Στην οντότητα εγγράφου η κωδικοποιημένη δήλωση είναι μέρος της XML δήλωσης. Το EncName είναι το όνομα της κωδικοποίησης που χρησιμοποιείται.

 Σε μια κωδικοποιημένη δήλωση, οι τιμές “UTF-8”, “UTF-16”, “ISO-10646-UCS-2”, και “ISO-10646-UCS-4” μπορούν να χρησιμοποιούνται στις ποικίλες κωδικοποιήσεις και μετασχηματισμούς του UNICODE /ISO/IEC 10646, οι τιμές “ISO-8859-1”, “ISO-8859-2”……..,“ISO-8859-9” ” μπορούν να χρησιμοποιούνται στο ISO8859 και οι τιμές “ISO –2022-JP”, “Shift_JIS”, και “EUC-JP” χρησιμοποιούνται για τις ποικίλες κωδικοποιημένες μορφές του JIS X-0208-1997. Οι XML επεξεργαστές μπορούν να αναγνωρίσουν άλλες κωδικοποιήσεις. Συνιστάται οι κωδικοποιήσεις χαρακτήρων να καταγραφούν στον IANA(Internet Assigned Numbers Authority), και σε σύγκριση με αυτές που βρίσκονται στη λίστα, θα αναφέρονται χρησιμοποιώντας τα ονόματα με τα οποία έχουν καταγραφεί. Αυτά τα ονόματα με τα οποία καταγράφονται έχουν οριστεί να είναι case-insensitive και οι επεξεργαστές θα λειτουργούν με αυτόν τον τρόπο.

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

Είναι μοιραίο λάθος όταν ο XML επεξεργαστής αντιμετωπίζει οντότητες με κωδικοποίηση που είναι αδύνατον να τις διαχειριστεί.

Παραδείγματα κωδικοποιημένων δηλώσεων: 

<?xml encoding='UTF-8'?>
<?xml encoding='EUC-JP'?>