- Sams Teach Yourself XML in 21 Days, Third Edition
- Table of Contents
- About the Author
- Acknowledgments
- We Want to Hear from You!
- Introduction
- Part I: At a Glance
- Day 1. Welcome to XML
- All About Markup Languages
- All About XML
- Looking at XML in a Browser
- Working with XML Data Yourself
- Structuring Your Data
- Creating Well-Formed XML Documents
- Creating Valid XML Documents
- How XML Is Used in the Real World
- Online XML Resources
- Summary
- Q&A
- Workshop
- Day 2. Creating XML Documents
- Choosing an XML Editor
- Using XML Browsers
- Using XML Validators
- Creating XML Documents Piece by Piece
- Creating Prologs
- Creating an XML Declaration
- Creating XML Comments
- Creating Processing Instructions
- Creating Tags and Elements
- Creating CDATA Sections
- Handling Entities
- Summary
- Q&A
- Workshop
- Day 3. Creating Well-Formed XML Documents
- What Makes an XML Document Well-Formed?
- Creating an Example XML Document
- Understanding the Well-Formedness Constraints
- Using XML Namespaces
- Understanding XML Infosets
- Understanding Canonical XML
- Summary
- Q&A
- Workshop
- Day 4. Creating Valid XML Documents: DTDs
- All About DTDs
- Validating a Document by Using a DTD
- Creating Element Content Models
- Commenting a DTD
- Supporting External DTDs
- Handling Namespaces in DTDs
- Summary
- Q&A
- Workshop
- Declaring Attributes in DTDs
- Day 5. Handling Attributes and Entities in DTDs
- Specifying Default Values
- Specifying Attribute Types
- Handling Entities
- Summary
- Q&A
- Workshop
- Day 6. Creating Valid XML Documents: XML Schemas
- Using XML Schema Tools
- Creating XML Schemas
- Dissecting an XML Schema
- The Built-in XML Schema Elements
- Creating Elements and Types
- Specifying a Number of Elements
- Specifying Element Default Values
- Creating Attributes
- Summary
- Q&A
- Workshop
- Day 7. Creating Types in XML Schemas
- Restricting Simple Types by Using XML Schema Facets
- Creating XML Schema Choices
- Using Anonymous Type Definitions
- Declaring Empty Elements
- Declaring Mixed-Content Elements
- Grouping Elements Together
- Grouping Attributes Together
- Declaring all Groups
- Handling Namespaces in Schemas
- Annotating an XML Schema
- Summary
- Q&A
- Workshop
- Part I. In Review
- Well-Formed Documents
- Valid Documents
- Part II: At a Glance
- Day 8. Formatting XML by Using Cascading Style Sheets
- Our Sample XML Document
- Introducing CSS
- Connecting CSS Style Sheets and XML Documents
- Creating Style Sheet Selectors
- Using Inline Styles
- Creating Style Rule Specifications in Style Sheets
- Summary
- Q&A
- Workshop
- Day 9. Formatting XML by Using XSLT
- Introducing XSLT
- Transforming XML by Using XSLT
- Writing XSLT Style Sheets
- Using <xsl:apply-templates>
- Using <xsl:value-of> and <xsl:for-each>
- Matching Nodes by Using the match Attribute
- Working with the select Attribute and XPath
- Using <xsl:copy>
- Using <xsl:if>
- Using <xsl:choose>
- Specifying the Output Document Type
- Summary
- Q&A
- Workshop
- Day 10. Working with XSL Formatting Objects
- Introducing XSL-FO
- Using XSL-FO
- Using XSL Formatting Objects and Properties
- Building an XSL-FO Document
- Handling Inline Formatting
- Formatting Lists
- Formatting Tables
- Summary
- Q&A
- Workshop
- Part II. In Review
- Using CSS
- Using XSLT
- Using XSL-FO
- Part III: At a Glance
- Day 11. Extending HTML with XHTML
- Why XHTML?
- Writing XHTML Documents
- Validating XHTML Documents
- The Basic XHTML Elements
- Organizing Text
- Formatting Text
- Selecting Fonts: <font>
- Comments: <!-->
- Summary
- Q&A
- Workshop
- Day 12. Putting XHTML to Work
- Creating Hyperlinks: <a>
- Linking to Other Documents: <link>
- Handling Images: <img>
- Creating Frame Documents: <frameset>
- Creating Frames: <frame>
- Creating Embedded Style Sheets: <style>
- Formatting Tables: <table>
- Creating Table Rows: <tr>
- Formatting Table Headers: <th>
- Formatting Table Data: <td>
- Extending XHTML
- Summary
- Q&A
- Workshop
- Day 13. Creating Graphics and Multimedia: SVG and SMIL
- Introducing SVG
- Creating an SVG Document
- Creating Rectangles
- Adobe's SVG Viewer
- Using CSS Styles
- Creating Circles
- Creating Ellipses
- Creating Lines
- Creating Polylines
- Creating Polygons
- Creating Text
- Creating Gradients
- Creating Paths
- Creating Text Paths
- Creating Groups and Transformations
- Creating Animation
- Creating Links
- Creating Scripts
- Embedding SVG in HTML
- Introducing SMIL
- Summary
- Q&A
- Workshop
- Day 14. Handling XLinks, XPointers, and XForms
- Introducing XLinks
- Beyond Simple XLinks
- Introducing XPointers
- Introducing XBase
- Introducing XForms
- Summary
- Workshop
- Part III. In Review
- Part IV: At a Glance
- Day 15. Using JavaScript and XML
- Introducing the W3C DOM
- Introducing the DOM Objects
- Working with the XML DOM in JavaScript
- Searching for Elements by Name
- Reading Attribute Values
- Getting All XML Data from a Document
- Validating XML Documents by Using DTDs
- Summary
- Q&A
- Workshop
- Day 16. Using Java and .NET: DOM
- Using Java to Read XML Data
- Finding Elements by Name
- Creating an XML Browser by Using Java
- Navigating Through XML Documents
- Writing XML by Using Java
- Summary
- Q&A
- Workshop
- Day 17. Using Java and .NET: SAX
- An Overview of SAX
- Using SAX
- Using SAX to Find Elements by Name
- Creating an XML Browser by Using Java and SAX
- Navigating Through XML Documents by Using SAX
- Writing XML by Using Java and SAX
- Summary
- Q&A
- Workshop
- Day 18. Working with SOAP and RDF
- Introducing SOAP
- A SOAP Example in .NET
- A SOAP Example in Java
- Introducing RDF
- Summary
- Q&A
- Workshop
- Part IV. In Review
- Part V: At a Glance
- Day 19. Handling XML Data Binding
- Introducing DSOs
- Binding HTML Elements to HTML Data
- Binding HTML Elements to XML Data
- Binding HTML Tables to XML Data
- Accessing Individual Data Fields
- Binding HTML Elements to XML Data by Using the XML DSO
- Binding HTML Tables to XML Data by Using the XML DSO
- Searching XML Data by Using a DSO and JavaScript
- Handling Hierarchical XML Data
- Summary
- Q&A
- Workshop
- Day 20. Working with XML and Databases
- XML, Databases, and ASP
- Storing Databases as XML
- Using XPath with a Database
- Introducing XQuery
- Summary
- Q&A
- Workshop
- Day 21. Handling XML in .NET
- Creating and Editing an XML Document in .NET
- From XML to Databases and Back
- Reading and Writing XML in .NET Code
- Using XML Controls to Display Formatted XML
- Creating XML Web Services
- Summary
- Q&A
- Workshop
- Part V. In Review
- Appendix A. Quiz Answers
- Quiz Answers for Day 1
- Quiz Answers for Day 2
- Quiz Answers for Day 3
- Quiz Answers for Day 4
- Quiz Answers for Day 5
- Quiz Answers for Day 6
- Quiz Answers for Day 7
- Quiz Answers for Day 8
- Quiz Answers for Day 9
- Quiz Answers for Day 10
- Quiz Answers for Day 11
- Quiz Answers for Day 12
- Quiz Answers for Day 13
- Quiz Answers for Day 14
- Quiz Answers for Day 15
- Quiz Answers for Day 16
- Quiz Answers for Day 17
- Quiz Answers for Day 18
- Quiz Answers for Day 19
- Quiz Answers for Day 20
- Quiz Answers for Day 21
Valid Documents
Besides being well-formed, XML documents may also be valid. A valid document must conform to a number of syntax rules. There are two ways to specify the syntax of XML documents[md]by using DTDs and XML schemas, each of which has its own syntax.
To declare a DTD, you use the <!DOCTYPE> element. That DTD can either be internal to the XML document (in which case you set the XML declaration's standalone attribute to "yes"), external to the XML document (in which case you give the DTD's URI and set the XML declaration's standalone attribute to "no"), or a combination of the two.
You can use <!ELEMENT> elements to declare XML elements in a DTD. When we use <!ELEMENT>, the syntax for elements is <!ELEMENT name content_model >. There are also various content models possible when declaring an element. You can use the content model ANY to allow any content and to turn off syntax checking, and we can use EMPTY to declare an empty element.
You can list possible child elements of an element this way:
<!ELEMENT document (client)>
This allows a <document> element to contain a <client> element. In addition, you can list the child elements that an element can contain like this:
<!ELEMENT client (name, contractDate, contracts)>
And you can specify that an element contains parsed character data by using #PCDATA.
In the DTD syntax, you can use the symbols + (one or more), * (zero or more), ? (one or none), and | (choices) to work with multiple child elements. And you can also use these symbols in sequences to specify exactly what child elements, or combinations of child elements, an element can contain.
In Part I you also saw that you declare attributes in a DTD by using an <!ATTLIST> element and that you can assign default values to attributes when you declare them. When you declare an attribute, you can assign an explicit default value enclosed in quotation marks, use #IMPLIED to make the attribute optional, use #FIXED to give it a fixed value, or use #REQUIRED to make an attribute required.
And you've also seen in Part I that you can declare the type of an attribute in an <!ATTLIST> element. The allowed types are CDATA, ENTITY, ENTITIES, an enumeration, an ID value, an IDREF value, IDREFS, NMTOKEN, NMTOKENS, and NOTATION. Here's what a DTD for your sample document might look like:
<?xml version = "1.0" encoding="UTF-8" standalone="yes"?> <!DOCTYPE document [ <!ELEMENT document (client)*> <!ELEMENT client (name, contractDate, contracts)> <!ELEMENT name (lastname, firstname)> <!ELEMENT lastname (#PCDATA)> <!ELEMENT firstname (#PCDATA)> <!ELEMENT contractDate (#PCDATA)> <!ELEMENT contracts (contract)*> <!ELEMENT contract (app, id, fee)> <!ELEMENT app (#PCDATA)> <!ELEMENT id (#PCDATA)> <!ELEMENT fee (#PCDATA)> <!ATTLIST liaison CDATA #IMPLIED> ]> <document> <liaison="no"> <name> <lastname>Kirk</lastname> <firstname>James</firstname> </name> <contractDate>September 5, 2092</contractDate> <contracts> <contract> <app>Comm</app> <id>111</id> <fee>$111.00</fee> </contract> <contract> <app>Accounting</app> <id>222</id> <fee>$989.00</fee> </contract> </contracts> </client> <liaison="yes"> <name> <lastname>McCoy</lastname> <firstname>Leonard</firstname> </name> <contractDate>September 7, 2092</contractDate> <contracts> <contract> <app>Stocker</app> <id>333</id> <fee>$2995.00</fee> </contract> <contract> <app>Dialer</app> <id>444</id> <fee>$200.00</fee> </contract> </contracts> </client> </document>
In Part I you also got an introduction to creating XML schemas. You saw that you start an XML schema with an XML declaration and an <xsd:schema> element, and in this element, you declare a namespace prefix such as xsd, which is assigned the URI setting "http://www.w3.org/2001/XMLSchema".
To declare elements and attributes in an XML document using an XML schema, you can use the XML schema elements <xsd:element> and <xsd:attribute>. Both <xsd:element> and <xsd:attribute> support an attribute named type, which lets you specify an element's or attribute's type.
There are two main types you can use: simple types and complex types. Simple types cannot enclose any child elements or have any attributes, but complex types can. As you've seen, elements can be declared by using simple or complex types, but attributes can only be declared by using simple types.
There are a number of simple types built into the XML schema specification, including xsd:string for strings, xsd:int for integers, and xsd:date for dates. You can also create your own simple types by using <xsd:simpleType>.
You can create complex types by using <xsd:complexType>, which may enclose the declarations of child elements. You saw on Day 6 that enclosing those child elements in an <xsd:sequence> element creates an element sequence and that the elements declared in sequence must appear in that sequence in the XML document.
You also saw that the <xsd:element> element has a minOccurs attribute to indicate the minimum number of times an element may appear at the location where it has been declared, and a maxOccurs attribute to set the maximum number of times it may occur. In addition, you saw that you can use the fixed and default attributes to specify whether an element has a fixed or default value.
To review how XML schemas work, let's take a look at an XML document that holds data about a property owner who wants to sell his properties:
<?xml version="1.0" encoding="UTF-8"?> <document documentDate="2005-12-02"> <evaluation>Wants to sell soon.</evaluation> <prospect> <name>Ralph Kramden</name> <location>311 Chauncey Street</location> <city>New York</city> <state>NY</state> </prospect> <properties> <house listingNumber="111 111 111"> <address>19 Oak Place</address> <sellingPrice>200000</sellingPrice> <listingPeriod>3</listingPeriod> </house> <house listingNumber="222 222 222"> <address>23 Maple Street</address> <sellingPrice>180000</sellingPrice> <listingPeriod>3</listingPeriod> </house> <house listingNumber="333 333 333"> <address>77 Chestnut Drive</address> <sellingPrice>160000</sellingPrice> <listingPeriod>6</listingPeriod> </house> <house listingNumber="444 4444 444"> <address>677 Pine Place</address> <sellingPrice>220000</sellingPrice> <listingPeriod>6</listingPeriod> </house> </properties> <broker> <name>XML Broker</name> <location>484 Ginko Street</location> <city>New York</city> <state>NY</state> </broker> </document>
The XML schema specifies the syntax of every element in this example in a natural XML way, where elements that enclose various child elements in the XML document also enclose those child elements in the XML schema. Here's what the XML schema that will validate the XML document looks like:
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="document" type="documentType"/> <xsd:complexType name="documentType"> <xsd:sequence> <xsd:element ref="evaluation" minOccurs="1"/> <xsd:element name="prospect" type="recordType"/> <xsd:element name="properties" type="propertiesType"/> <xsd:element name="broker" type="recordType"/> </xsd:sequence> <xsd:attribute name="documentDate" type="xsd:date"/> </xsd:complexType> <xsd:complexType name="recordType"> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element name="location" type="xsd:string"/> <xsd:element name="city" type="xsd:string"/> <xsd:element name="state" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="propertiesType"> <xsd:sequence> <xsd:element name="house" minOccurs="1" maxOccurs="8"> <xsd:complexType> <xsd:sequence> <xsd:element name="address" type="xsd:string"/> <xsd:element name="sellingPrice" type="xsd:decimal"/> <xsd:element name="listingPeriod"> <xsd:simpleType> <xsd:restriction base="xsd:integer"> <xsd:maxInclusive value="6"/> </xsd:restriction> </xsd:simpleType> </xsd:element> </xsd:sequence> <xsd:attribute name="listingNumber" type="listingNumberType"/> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> <xsd:simpleType name="listingNumberType"> <xsd:restriction base="xsd:string"> <xsd:pattern value="\d{3} \d{3} \d{3}"/> </xsd:restriction> </xsd:simpleType> <xsd:element name="evaluation" type="xsd:string"/> </xsd:schema>
XML schemas like this aren't necessarily easy to create. However, there are a number of tools out there that can create XML schema for you.
And that's it. Part I helped get you started creating XML documents and making sure they're well-formed and valid. In Part II, you're going to start working on formatting the data in XML documents for presentation.