Ο Ορισμός Τύπου Εγγράφου (DTD)

από • 16/02/2014 • Education, XMLΣχόλια (0)4319

Ο Ορισμός Τύπου Εγγράφου (DTD)

Εισαγωγή στο DTD

Ο σκοπός του DTD (Document Type Definition) είναι να ορίσει τα έγκυρα μπλοκς δόμησης ενός XML εγγράφου. Ορίζει τη δομή του εγγράφου με μια λίστα έγκυρων στοιχείων. Ένα DTD μπορεί να ορισθεί μέσα (inline) σ’ ένα XML έγγραφο ή με μια εξωτερική αναφορά.

Εσωτερική Δήλωση DOCTYPE

Αν το DTD περιλαμβάνεται στο πηγαίο XML αρχείο, πρέπει να τοποθετηθεί σ’ έναν ορισμό DOCTYPE με την εξής σύνταξη :

<!DOCTYPE root-element [element-declarations]>

Παράδειγμα ενός XML εγγράφου που περιέχει ένα DTD :

<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to      (#PCDATA)>
<!ELEMENT from    (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body    (#PCDATA)>
]>
<note>
<to> Tove </to>
<from> Jani </from>
<heading> Reminder </heading>
<body> Don't forget me this weekend </body>
</note>

Το παραπάνω DTD ερμηνεύεται ως εξής :

  • Το !DOCTYPE note (στη γραμμή 2) ορίζει ότι πρόκειται για ένα έγγραφο του τύπου note.
  • Το !ELEMENT note (στη γραμμή 3) ορίζει το στοιχείο (element) note να περιέχει τα εξής τέσσερα στοιχεία : to, from, heading και body.
  • Το !ELEMENT to (στη γραμμή 4) ορίζει ότι το στοιχείο to είναι του τύπου «#PCDATA».
  • Το !ELEMENT from (στη γραμμή 5) ορίζει ότι το στοιχείο from είναι του τύπου «#PCDATA» κοκ.
Ο Ορισμός Τύπου Εγγράφου (DTD)

Εξωτερική Δήλωση DOCTYPE

Αν το DTD είναι εξωτερικό στο πηγαίο XML αρχείο, πρέπει να τοποθετηθεί σ’ έναν ορισμό DOCTYPE με την ακόλουθη σύνταξη :

<!DOCTYPE root-element SYSTEM "filename">

Πρόκειται για το ίδιο XML έγγραφο όπως παραπάνω, αλλά μ’ ένα εξωτερικό DTD :

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to> Tove </to>
<from> Jani </from>
<heading> Reminder </heading>
<body> Don't forget me this weekend! </body>
</note>

Και αυτό είναι ένα αντίγραφο του αρχείου note.dtd που περιέχει το DTD :

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

Γιατί Πρέπει να Χρησιμοποιούμε ένα DTD

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

Πολλά forums εμφανίζονται τελευταία για τον ορισμό στάνταρτ DTDs για ο,τιδήποτε σχεδόν υπάρχει στις περιοχές της ανταλλαγής δεδομένων. Ρί-ξτε μια ματιά στο http://www.schema.net.

Τα Μπλοκς Δόμησης DTD

Τα κύρια μπλοκς δόμησης (main building blocks) αμφοτέρων των εγγράφων XML και HTML είναι στοιχεία tagged όπως το <body> …. </body>. Αν τα δούμε από την πλευρά του DTD, όλα τα XML έγγραφα (αλλά και τα HTML έγγραφα) αποτελούνται από τα εξής απλά μπλοκς δόμησης :

  • Elements (Στοιχεία)
  • Tags (Ετικέτες)
  • Attributes (Χαρακτηριστικά)
  • Entities (Ονότητες)
  • PCDATA
  • CDATA

Ακολουθεί μια σύντομη επεξήγηση για καθένα από τα μπλοκς δόμησης :

Elements

Τα elements (στοιχεία) αποτελούν τα κύρια μπλοκς δόμησης των εγγράφων XML και HTML. Παραδείγματα στοιχείων της HTML είναι τα «body» και «table». Παραδείγματα στοιχείων της XML θα μπορούσαν να είναι τα «note» και «message». Τα στοιχεία μπορούν να περιέχουν κείμενο, άλλα στοιχεία ή να είναι κενά. Παραδείγματα κενών στοιχείων της HTML είναι τα «hr», «br» και «img».

Tags

Τα tags (ετικέτες) χρησιμοποιούνται για να σημάνουν (markup) στοιχεία. Ένα tag αρχής, όπως το <element_name>, σημαίνει την αρχή ενός στοιχείου και ένα tagκλεισίματος, όπως το </element_name>, σημαίνει το τέλος ενός στοιχείου.

Παραδείγματα :

<body> … κείμενο … </body>
<message> … μήνυμα … </message>

Attributes

Τα χαρακτηριστικά ή ιδιότητες (attributes) παρέχουν έξτρα πληροφορίες για τα στοιχεία, τοποθετούνται πάντα μέσα στο tag αρχής ενός στοιχείου και εμφανίζονται πάντα σαν ζευγάρια ονόματος/τιμής (name/value). Το ακόλουθο στοιχείο img περιέχει επιπλέον πληροφορίες για το πηγαίο αρχείο :

<img src="computer.gif" />

Το όνομα του στοιχείου είναι img και το όνομα της ιδιότητας είναι src. Η τιμή της ιδιότητας είναι computer.gif. Εφόσον το ίδιο το στοιχείο είναι κενό, περικλείεται από ένα /.

Entities

Τα entities (οντότητες) είναι μεταβλητές (variables) που χρησιμοποιούνται για να ορίσουν συχνά χρησιμοποιούμενο κείμενο (common text). Οι αναφορές οντοτήτων (entity references) είναι αναφορές σε οντότητες. Είναι γνωστή η εξής αναφορά οντότητας της HTML : &nbsp; (no-breaking-space), η οποία χρησιμοποιείται για να εισάγουμε έναν επιπλέον κενό χαρακτήρα σ’ ένα έγγραφο. Οι οντότητες αναπτύσσονται όταν ένα έγγραφο γίνεται parsed από έναν XMLparser.

Οι ακόλουθες οντότητες είναι προκαθορισμένες (predefined) στην XML :

Αναφορές Οντοτήτων Χαρακτήρας

&lt;                                <

&gt;                               >

&amp;                           &

&quot;                           «

&apos;                           ‘

PCDATA

Το PCDATA σημαίνει parsed character data. Μπορούμε να φανταστούμε τα character data σαν το κείμενο που βρίσκεται ανάμεσα στα tags αρχής και τέλους ενός στοιχείου της XML. Το PCDATA είναι κείμενο που θα γίνει parsed από έναν parser. Τα tags που βρίσκονται μέσα στο κείμενο θα αντιμετωπιστούν σαν σημάνσεις και οι οντότητες θα αναπτυχθούν.

CDATA

Το CDATA σημαίνει επίσης character data και είναι κείμενο που ΔΕΝ θα γίνει parsed από έναν parser. Τα tags που βρίσκονται μέσα στο κείμενο ΔΕΝ θα αντιμετωπιστούν σαν σημάνσεις και οι οντότητες δεν θα αναπτυχθούν.

Τα Στοιχεία (Elements) του DTD

Σ’ ένα DTD, τα XML στοιχεία δηλώνονται με μια δήλωση στοιχείου DTD (DTD element declaration) με την εξής σύνταξη :

<!ELEMENT element-name category>

ή

<!ELEMENT element-name (element-content)>

Τα κενά στοιχεία (empty elements) δηλώνονται με τη λέξη κλειδί κατηγορίας EMPTY, ως εξής :

<!ELEMENT element-name EMPTY>

Παράδειγμα DTD :

<!ELEMENT br EMPTY>

Παράδειγμα XML :

<br />

Τα στοιχεία που έχουν μόνο character data δηλώνονται με το #PCDATA ανάμεσα σε παρενθέσεις :

<!ELEMENT element-name (#PCDATA)>

Παράδειγμα :

<!ELEMENT note (#PCDATA)>

Τα #PCDATA είναι character data που θα γίνουν parsed από έναν parser. Αν ένα τμήμα (section) #PCDATA περιέχει στοιχεία, αυτά τα στοιχεία πρέπει να δηλωθούν επίσης.

Τα στοιχεία που δηλώνονται με τη λέξη κλειδί κατηγορίας ANY, μπορούν να περιέχουν έναν οποιοδήποτε συνδυασμό parsable δεδομένων :

<!ELEMENT element-name ANY>

Παράδειγμα :

<!ELEMENT note ANY>

Τα στοιχεία μ’ ένα ή περισσότερα παιδιά ορίζονται με τα ονόματα των στοιχείων παιδιών μέσα σε παρενθέσεις :

<!ELEMENT element-name
(child-element-name)>

ή

<!ELEMENT element-name
(child-element-name)>

Παράδειγμα :

<!ELEMENT note (to,from,heading,body)>

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

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to      (#PCDATA)>
<!ELEMENT from    (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body    (#PCDATA)>

Δήλωση μόνο μίας εμφάνισης του ίδιου στοιχείου :

<!ELEMENT element-name (child-name)>

Παράδειγμα :

<!ELEMENT note (message)>

Το παραπάνω παράδειγμα δηλώνει ότι το στοιχείο παιδί message μπορεί να λάβει χώρα μόνο μία φορά μέσα στο στοιχείο note.

Δήλωση τουλάχιστον μίας εμφάνισης του ίδιου στοιχείου :

<!ELEMENT element-name (child-name+)>

Παράδειγμα :

<!ELEMENT note (message+)>

Το σύμβολο + στο παραπάνω παράδειγμα δηλώνει ότι το στοιχείο παιδί message μπορεί να λάβει χώρα μία ή περισσότερες φορές μέσα στο στοιχείο note.

Δήλωση καμίας ή περισσότερων εμφανίσεων του ίδιου στοιχείου :

<!ELEMENT element-name (child-name*)>

Παράδειγμα :

<!ELEMENT note (message*)>

Το σύμβολο * στο παραπάνω παράδειγμα δηλώνει ότι το στοιχείο παι-δί message μπορεί να λάβει χώρα καμία ή περισσότερες φορές μέσα στο στοιχείο note.

Δήλωση καμίας ή μίας εμφάνισης του ίδιου στοιχείου :

<!ELEMENT element-name (child-name?)>

Παράδειγμα :

<!ELEMENT note (message?)>

Το σύμβολο ? στο παραπάνω παράδειγμα δηλώνει ότι το στοιχείο παιδί message μπορεί να λάβει χώρα καμία ή μία φορά μέσα στο στοιχείο note.

Δήλωση περιεχομένου με διάζευξη (ή)

Παράδειγμα :

<!ELEMENT note (to,from,header,message|body)>

Το παραπάνω παράδειγμα δηλώνει ότι το στοιχείο note πρέπει να περιέχει ένα στοιχείο to, ένα στοιχείο from, ένα στοιχείο header και είτε ένα στοιχείο messageή ένα στοιχείο body.

Δήλωση μικτού περιεχομένου :

Παράδειγμα :

<!ELEMENT note (#PCDATA|to|from|header|message)*>

Το παραπάνω παράδειγμα δηλώνει ότι το στοιχείο note μπορεί να περιέχει parsed character data ή έναν οποιονδήποτε αριθμό από τα στοιχεία to, from, headerκαι message.

Τα Χαρακτηριστικά (Attributes) του DTD

Σ’ ένα DTD, τα attributes δηλώνονται με μια δήλωση ATTLIST.

Μια δήλωση attribute έχει την εξής σύνταξη :

<!ATTLIST element-name attribute-name attribute-type default-value>

Παράδειγμα σε DTD :

<!ATTLIST payment type CDATA "check">

Παράδειγμα σε XML :

<payment type="check">

Το attribute-type μπορεί να έχει τις εξής τιμές :

Τιμή

Επεξήγηση

CDATAΗ τιμή είναι character data
(en1|en2|..)Η τιμή πρέπει να προέρχεται από μια αριθμημένη λίστα
IDΗ τιμή είναι ένα μοναδικό id
IDREFΗ τιμή είναι το id ενός άλλου στοιχείου
IDREFSΗ τιμή είναι μια λίστα από άλλα ids
NMTOKENΗ τιμή είναι ένα έγκυρο XML όνομα
NMTOKENSΗ τιμή είναι μια λίστα από έγκυρα XML ονόματα
ENTITYΗ τιμή είναι μια οντότητα (entity)
ENTITIESΗ τιμή είναι μια λίστα οντοτήτων
NOTATIONΗ τιμή είναι το όνομα ενός notation
xml:Η τιμή είναι μια προκαθορισμένη xml τιμή

Το default-value μπορεί να έχει τις εξής τιμές :

Τιμή

Επεξήγηση

ValueΗ προκαθορισμένη τιμή των attributes
#DEFAULT valueΗ προκαθορισμένη τιμή των attributes
#REQUIREDΗ τιμή του attribute πρέπει να υπάρχει στο στοιχείο
#IMPLIEDΤο attribute δεν είναι υποχρεωτικό να υπάρχει
#FIXED valueΗ τιμή του attribute είναι σταθερή

Παράδειγμα δήλωσης attribute :

Παράδειγμα σε DTD :

<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA "0">

Παράδειγμα σε XML :

<square width="100"></square>

Στο παραπάνω παράδειγμα, το στοιχείο square ορίζεται να είναι ένα κενό στοιχείο μ’ ένα width attribute του τύπου CDATA. Αν δεν δοθεί κανένα width attribute, το width attribute θα έχει μια προκαθορισμένη τιμή ίση με 0.

Default attribute value :

Σύνταξη :

<!ATTLIST element-name attribute-name attribute-type "default-value">

Παράδειγμα σε DTD :

<!ATTLIST payment type CDATA "check">

Παράδειγμα σε XML :

<payment type="check">

Ο καθορισμός μιας προκαθορισμένης τιμής (default value) για ένα attribute, εξασφαλίζει ότι το attribute θα έχει μια τιμή ακόμη κι αν ο συγγραφέας του XMLεγγράφου δεν την συμπεριλάβει.

Implied attribute :

Σύνταξη :

<!ATTLIST element-name attribute-name attribute-type #IMPLIED>

Παράδειγμα σε DTD :

<!ATTLIST contact fax CDATA #IMPLIED>

Παράδειγμα σε XML :

<contact fax="555-667788">

Χρησιμοποιούμε ένα implied attribute αν δεν θέλουμε να αναγκάσουμε τον συγγραφέα να συμπεριλάβει ένα attribute και δεν έχουμε μια επιλογή για μια προκαθορισμένη τιμή (default value).

Required attribute :

Σύνταξη :

<!ATTLIST element-name attribute_name attribute-type #REQUIRED>

Παράδειγμα σε DTD :

<!ATTLIST person number CDATA #REQUIRED>

Παράδειγμα σε XML :

<person number="5677">

Χρησιμοποιούμε ένα required attribute αν δεν έχουμε μια επιλογή για μια προκαθορισμένη τιμή (default value), αλλά θέλουμε το attribute να υπάρχει οπωσδήποτε.

Fixed attribute value :

Σύνταξη :

<!ATTLIST element-name attribute-name attribute-type #FIXED "value">

Παράδειγμα σε DTD :

<!ATTLIST sender company CDATA #FIXED "Microsoft">

Παράδειγμα σε XML :

<sender company="Microsoft">

Χρησιμοποιούμε μια fixed attribute τιμή όταν θέλουμε ένα attribute να έχει μια σταθερή τιμή χωρίς να μπορεί να την αλλάξει ο συγγραφέας. Αν ο συγγραφέας συμπεριλάβει μια άλλη τιμή, ο XML parser θα επιστρέψει λάθος.

Enumerated attribute values :

Σύνταξη :

<!ATTLIST element-name attribute-name (en1|en2|..) default-value>

Παράδειγμα σε DTD :

<!ATTLIST payment type (check|cash) "cash">

Παράδειγμα σε XML :

<payment type="check">

ή

<payment type="cash">

Χρησιμοποιούμε enumerated attribute τιμές όταν θέλουμε οι τιμές αυτές να ανήκουν σ’ ένα σύνολο έγκυρο τιμών.

Οι Οντότητες (Entities) του DTD

Οι οντότητες (entities) είναι μεταβλητές που χρησιμοποιούνται για να ορίσουν συντομεύσεις (shortcuts) σε common text.

  • Οι αναφορές οντοτήτων (entity references) είναι αναφορές σε οντότητες.
  • Οι οντότητες (entities) μπορούν να δηλωθούν σαν εσωτερικές (internal) ή εξωτερικές (external).

Δήλωση Εσωτερικής Οντότητας (Internal Entity Declaration)

Σύνταξη :

<!ENTITY entity-name "entity-value">

Παράδειγμα σε DTD :

<!ENTITY writer "Donald Duck.">
<!ENTITY copyright "Copyright W3Schools.">

Παράδειγμα σε XML :

<author>&writer;&copyright;</author>

Δήλωση Εξωτερικής Οντότητας (External Entity Declaration)

Σύνταξη :

<!ENTITY entity-name SYSTEM "URI/URL">

Παράδειγμα σε DTD :

<!ENTITY writer   
SYSTEM "http://www.w3schools.com/entities/entities.xml">
<!ENTITY copyright
SYSTEM "http://www.w3schools.com/entities/entities.dtd">

Παράδειγμα σε XML :

<author>&writer;&copyright;</author>

DTD Validation

Ο Internet Explorer 5.0 μπορεί να επικυρώσει (validate) ένα XML ως προς ένα DTD.

Επικύρωση με τον XML Parser

Αν προσπαθήσουμε να ανοίξουμε ένα XML έγγραφο, ο XML Parser ίσως εμφανίσει ένα λάθος. Έχοντας πρόσβαση στο αντικείμενο parseError, ο ακριβής κώδικας λάθους (error code), το κείμενο λάθους (error text) και ακόμη και η γραμμή που προκάλεσε το λάθος (error line) μπορούν να γίνουν γνωστά :

var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.validateOnParse="true"
xmlDoc.load("note_dtd_error.xml")
document.write("<br>Error Code: ")
document.write(xmlDoc.parseError.errorCode)
document.write("<br>Error Reason: ")
document.write(xmlDoc.parseError.reason)
document.write("<br>Error Line: ")
document.write(xmlDoc.parseError.line)

Ακύρωση της Επικύρωσης (Validation)

Η επικύρωση μπορεί να ακυρωθεί δίνοντας την εξής τιμή :

validateOnParse="false"
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.validateOnParse="false"
xmlDoc.load("note_dtd_error.xml")
document.write("<br>Error Code: ")
document.write(xmlDoc.parseError.errorCode)
document.write("<br>Error Reason: ")
document.write(xmlDoc.parseError.reason)
document.write("<br>Error Line: ")
document.write(xmlDoc.parseError.line)

Παραδείγματα για το DTD από το Διαδίκτυο

TV Schedule DTD

By David Moisan. Copied from his Web :

http://www.shore.net/~dmoisan/

<!DOCTYPE TVSCHEDULE [
<!ELEMENT TVSCHEDULE (CHANNEL+)>
<!ELEMENT CHANNEL (BANNER, DAY+)>
<!ELEMENT BANNER (#PCDATA)>
<!ELEMENT DAY ((DATE, HOLIDAY) | (DATE, PROGRAMSLOT+))+>
<!ELEMENT HOLIDAY (#PCDATA)>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT PROGRAMSLOT (TIME, TITLE, DESCRIPTION?)>
<!ELEMENT TIME (#PCDATA)>
<!ELEMENT TITLE (#PCDATA)>
<!ELEMENT DESCRIPTION (#PCDATA)>
<!ATTLIST TVSCHEDULE NAME CDATA #REQUIRED>
<!ATTLIST CHANNEL CHAN CDATA #REQUIRED>
<!ATTLIST PROGRAMSLOT VTR CDATA #IMPLIED>
<!ATTLIST TITLE RATING CDATA #IMPLIED>
<!ATTLIST TITLE LANGUAGE CDATA #IMPLIED>
]>

A Report DTD

By Richard Erlander. Copied from his Web :

http://pdbeam.uwaterloo.ca/~rlander/

<!DOCTYPE REPORT [
<!ENTITY xml "Extensible Markup Language">
<!ENTITY sgml "Standard Generalized Markup Language">
<!ENTITY pxa "Professional XML Authoring">
<!ENTITY % TEXT "(#PCDATA|CODE|KEYWORD|QUOTATION)*">
<!ENTITY % BLOCK "(PARA|LIST)+">
<!ENTITY % BODY "(%BLOCK;|EXAMPLE|NOTE)+">
<!ELEMENT REPORT (TITLE,(SECTION|SHORTSECT)+)>
<!ELEMENT SECTION (TITLE,%BODY;,SUBSECTION*)>
<!ELEMENT SUBSECTION (TITLE,%BODY;,SUBSECTION*)>
<!ELEMENT SHORTSECT (TITLE,%BODY;)>
<!ELEMENT TITLE %TEXT;>
<!ELEMENT PARA %TEXT;>
<!ELEMENT LIST (ITEM)+>
<!ELEMENT ITEM (%BLOCK;)>
<!ELEMENT CODE (#PCDATA)>
<!ELEMENT KEYWORD (#PCDATA)>
<!ELEMENT EXAMPLE (TITLE?,%BLOCK;)>
<!ELEMENT GRAPHIC EMPTY>
<!ATTLIST REPORT security (high | medium | low ) "low">
<!ATTLIST CODE type CDATA #IMPLIED>
<!ATTLIST GRAPHIC file ENTITY #REQUIRED>
<!NOTATION GIF SYSTEM "">
<!NOTATION JPG SYSTEM "">
<!NOTATION BMP SYSTEM "">
]>

Newspaper Article DTD

Copied from http://www.vervet.com/

<!DOCTYPE NEWSPAPER [
<!ELEMENT NEWSPAPER (ARTICLE+)>
<!ELEMENT ARTICLE (HEADLINE, BYLINE, LEAD, BODY, NOTES)>
<!ELEMENT HEADLINE (#PCDATA)>
<!ELEMENT BYLINE (#PCDATA)>
<!ELEMENT LEAD (#PCDATA)>
<!ELEMENT BODY (#PCDATA)>
<!ELEMENT NOTES (#PCDATA)>
<!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED>
<!ATTLIST ARTICLE EDITOR CDATA #IMPLIED>
<!ATTLIST ARTICLE DATE CDATA #IMPLIED>
<!ATTLIST ARTICLE EDITION CDATA #IMPLIED>
<!ENTITY NEWSPAPER "Vervet Logic Times">
<!ENTITY PUBLISHER "Vervet Logic Press">
<!ENTITY COPYRIGHT "Copyright 1998 Vervet Logic Press">
]>

Product Catalog DTD

Copied from http://www.vervet.com/

<!DOCTYPE CATALOG [
<!ENTITY AUTHOR "John Doe">
<!ENTITY COMPANY "JD Power Tools, Inc.">
<!ENTITY EMAIL "[email protected]">
<!ELEMENT CATALOG (PRODUCT+)>
<!ELEMENT PRODUCT
(SPECIFICATIONS+,OPTIONS?,PRICE+,NOTES?)>
<!ATTLIST PRODUCT
NAME CDATA #IMPLIED
CATEGORY (HandTool|Table|Shop-Professional) "HandTool"
PARTNUM CDATA #IMPLIED
PLANT (Pittsburgh|Milwaukee|Chicago) "Chicago"
INVENTORY (InStock|Backordered|Discontinued) "InStock">
<!ELEMENT SPECIFICATIONS (#PCDATA)>
<!ATTLIST SPECIFICATIONS
WEIGHT CDATA #IMPLIED
POWER CDATA #IMPLIED>
<!ELEMENT OPTIONS (#PCDATA)>
<!ATTLIST OPTIONS
FINISH (Metal|Polished|Matte) "Matte"
ADAPTER (Included|Optional|NotApplicable) "Included"
CASE (HardShell|Soft|NotApplicable) "HardShell">
<!ELEMENT PRICE (#PCDATA)>
<!ATTLIST PRICE
MSRP CDATA #IMPLIED
WHOLESALE CDATA #IMPLIED
STREET CDATA #IMPLIED
SHIPPING CDATA #IMPLIED>
<!ELEMENT NOTES (#PCDATA)>
]>

Πηγή: 

ΠΛΗ.ΝΕ.Τ

Αν βρήκατε το άρθρο μας χρήσιμο, θέλετε να μείνετε ενημερωμένοι για όλα τα νέα στο τομέα της τεχνολογίας καθώς και σε χρηστικά άρθρα, βοηθήστε μας κάνοντας like στην σελίδα μας στο Facebook πατώντας εδώ

Σχετικά Άρθρα