- 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
Introducing the DOM Objects
Here's an overview of the W3C DOM Level 1 objects:
- Document — The document object
- DocumentFragment — A reference to a fragment of a document
- DocumentType — A reference to the <!DOCTYPE> element
- EntityReference — A reference to an entity
- Element — An element
- Attr — An attribute
- ProcessingInstruction — A processing instruction
- Comment — The content of an XML comment
- Text — The text content of an element or attribute
- CDATASection — A CDATA section.
- Entity — A parsed or unparsed entity in the XML document
- Notation — A notation
- Node — A single node in the document tree
- NodeList — A list of node objects; allows iteration and indexed access operations
- NamedNodeMap — A collection that allows iteration and access by name to the collection of attributes
That's the official list of objects. However, Microsoft, going its own way as usual, supports the W3C DOM but uses its own names for the programming objects:
- DOMDocument — The first node of the XML DOM tree
- XMLDOMNode — A single node in the document tree
- XMLDOMNodeList — A list of node objects
- XMLDOMNamedNodeMap — A map of named nodes; supports access by name to a collection of attributes
- XMLDOMParseError — Data about an error; includes error number, line number, character position, and a text description
- XMLHttpRequest — An object that supports communication with HTTP servers
- XTLRuntime — An object that supports methods that you can call from XSL style sheets
- XMLDOMAttribute — An attribute object
- XMLDOMCDATASection — A CDATA section object
- XMLDOMCharacterData — An object that supports methods used for text manipulation
- XMLDOMComment — A comment
- XMLDOMDocumentFragment — A document fragment object
- XMLDOMDocumentType — Data for the document type declaration
- XMLDOMElement — An element object
- XMLDOMEntity — A parsed or unparsed entity in the XML document
- XMLDOMEntityReference — An entity reference node
- XMLDOMImplementation — An object that supports general DOM methods
- XMLDOMNotation — A notation
- XMLDOMProcessingInstruction — A processing instruction
- XMLDOMText — The text value of an element or attribute
The list of DOM objects is substantial, so the following sections go through some of the highlights you'll need in code, starting with the main object, the DOMDocument object.
Using the DOMDocument Object
In the Microsoft version of the DOM, the DOMDocument object is the main object, and it represents the top node in every document tree. When we're working with the DOM, this is the only object we create directly. Here's how you might create the DOMDocument object in JavaScript:
function readXMLData() { var xmlDocumentObject xmlDocumentObject = new ActiveXObject("Microsoft.XMLDOM") xmlDocumentObject.load("ch15_01.xml") . . .
The Microsoft.XMLDOM class used here is an early version of Microsoft's XML support, but it's still supported in recent versions of Internet Explorer, which means we can use it as a common denominator in our code. The current version, and the one to use if you can (because it supports the full DOM 1.0 as well as XML schemas), is Microsoft's MSXML version 4.0, which comes with recent versions of Internet Explorer 6. Here's how to use this version:
function readXMLData() { var xmlDocumentObject xmlDocumentObject = new ActiveXObject("MSXML2.DOMDocument.4.0") xmlDocumentObject.load("ch15_01.xml") . . .
You can also specify earlier versions of the Microsoft.XMLDOM class by using "MSXML2.DOMDocument.2.0" or "MSXML2.DOMDocument.3.0".
Here's an overview of the most significant properties of the DOMDocument object:
- attributes — Contains the list of attributes for the node. Read-only.
- childNodes — Contains a node list of the child nodes of nodes that may have children. Read-only.
- dataType*— Contains the data type for the node. Read/write.
- definition*— Contains the definition of the node in the DTD or schema. Read-only.
- doctype — Contains the document type node, which is what specifies the DTD for the document. Read-only.
- documentElement — Contains the root element of the document. Read/write.
- firstChild — Contains the first child of the current node. Read-only.
- lastChild — Contains the last child node of the current node. Read-only.
- namespaceURI*— Contains the URI of a namespace. Read-only.
- nextSibling — Contains the next sibling node of the current node. Read-only.
- nodeName — Contains the qualified name of the element, attribute, or entity reference. Read-only.
- nodeType — Contains the node type. Read-only.
- nodeTypedValue*— Contains the node's value. Read/write.
- nodeTypeString*— Contains the node type, expressed as a string. Read-only.
- nodeValue — Contains the text of the node. Read/write.
- ondataavailable*— Sets the event handler for the ondataavailable event. Read/write.
- onreadystatechange*— Sets the event handler that handles readyState property changes. Read/write.
- ontransformnode *— Sets the event handler for the ontransformnode event. Read/write.
- ownerDocument — Contains the root of the document that contains this node. Read-only.
- parentNode — Contains the parent node of the current node. Read-only.
- parsed*— Is set to true if this node has been parsed; false otherwise. Read-only.
- parseError*— Contains information about the most recent parsing error. Read-only.
- prefix*— Contains the namespace prefix. Read-only.
- preserveWhiteSpace*— Is set to true if processing should preserve whitespace; false otherwise. Read/write.
- previousSibling — Contains the previous sibling of this node. Read-only.
- readyState*— Contains the current browser state of the XML document. Read-only.
- text*— Contains the text content of the node and its subtrees. Read/write.
- url*— Contains the URL for the most recently loaded XML document. Read-only.
- validateOnParse*— Is set to true (the default) if the parser should validate this document on parsing it; false if not. Read/write.
- xml*— Contains the XML text representation of the node and all of its children. Read-only.
Here is an overview of the significant methods for this object:
- abort*— Aborts a download.
- appendChild — Appends a new child as the last child of the current node.
- cloneNode — Returns a node that is a copy of this node.
- createAttribute — Returns a new attribute, using the given name.
- createCDATASection — Returns a CDATA section node that contains the given data.
- createComment — Returns a comment node.
- createDocumentFragment — Returns an empty DocumentFragment object.
- createElement — Returns an element node, using the given name.
- createEntityReference — Returns a new EntityReference object.
- createNode*— Returns a node, using the given type, name, and namespace.
- createProcessingInstruction — Returns a processing instruction node.
- createTextNode — Returns a text node that contains the given data.
- getElementsByTagName — Yields a collection of elements that have the given name.
- hasChildNodes — Returns true if this node has children; false if not.
- insertBefore — Inserts a child node before the given node.
- load*— Loads an XML document from the given location.
- loadXML*— Loads an XML document, using the given string.
- nodeFromID*— Yields the node whose ID attribute matches the given value.
- removeChild — Removes the given child node from the list of children.
- replaceChild — Replaces the given child node with the given new child node.
- save*— Saves an XML document to the given location.
- transformNode*— Transforms the node and its children by using the given XSL style sheet.
Using the XMLDOMNode Object
The Microsoft XMLDOMNode object extends the core XML DOM Node object by adding support for data types, namespaces, DTDs, and schemas, as implemented in Internet Explorer. It's the generic object used to handle nodes. Here is an overview of the significant properties of this object:
- attributes — List of attributes for the node. Read-only.
- childNodes — List containing the child nodes of the current node. Read-only.
- dataType*— Contains the data type for this node. Read/write.
- firstChild — Contains the first child of the current node. Read-only.
- lastChild — Contains the last child of the current node. Read-only.
- namespaceURI*— Contains the URI for the namespace. Read-only.
- nextSibling — Contains the next sibling of this node. Read-only.
- nodeName — Contains the qualified name for an element, attribute, or entity reference, or a string for other node types. Read-only.
- nodeType — Contains the node type. Read-only.
- nodeTypedValue*— Contains the node's value. Read/write.
- nodeTypeString*— Contains the node type, in string form. Read-only.
- nodeValue — Contains the text associated with the node. Read/write.
- ownerDocument — Contains the root of the document. Read-only.
- parentNode — Contains the parent node. Read-only.
- parsed*— Returns true if this node has been parsed; false otherwise. Read-only.
- prefix*— Contains the namespace prefix. Read-only.
- previousSibling — Contains the previous sibling of this node. Read-only.
- text*— Contains the text content of the node and its subtrees. Read/write.
- xml*— Contains the XML representation of the node and its children. Read-only.
Here is an overview of the significant methods for this object:
- appendChild — Appends a new child as the last child of this node.
- cloneNode — Creates a new node that is a copy of this node.
- hasChildNodes — Returns true if this node has children; false otherwise.
- insertBefore — Inserts a child node before the given node.
- removeChild — Removes the given child node.
- replaceChild — Replaces the given child node with the given new child node.
- transformNode *— Transforms the node and its children by using the given XSL style sheet.
Using the XMLDOMElement Object
The type of node you'll probably work with most often is the element node, which is supported in the Microsoft programming model by the XMLDOMElement object. Here are the significant properties of the XMLDOMElement object:
- attributes — List of attributes for the node. Read-only.
- childNodes — Contains a list of the node's children. Read-only.
- dataType*— Contains the data type for this node. Read/write.
- firstChild — Contains the first child node of this node. Read-only.
- lastChild — Contains the last child node of this node. Read-only.
- namespaceURI*— Contains the URI for the namespace. Read-only.
- nextSibling — Contains the next sibling of this node. Read-only.
- nodeName — Contains the qualified name of an element, attribute, or entity reference, or a string for other node types. Read-only.
- nodeType — Contains the node type. Read-only.
- nodeTypeString*— Contains the node type, in string form. Read-only.
- nodeValue — Contains the text associated with the node. Read/write.
- ownerDocument — Contains the root of the document. Read-only.
- parentNode — Contains the parent node of the current node. Read-only.
- parsed*— Returns true if this node has been parsed; false otherwise. Read-only.
- prefix*— Contains the namespace prefix. Read-only.
- previousSibling — Contains the previous sibling of this node. Read-only.
- tagName — Contains the element name. Read-only.
- text*— Contains the text content of the node and its subtrees. Read/write.
- xml*— Contains the XML text representation of the node and all of its children. Read-only.
Here are the significant methods of this object:
- appendChild — Appends a new child as the last child of the current node.
- cloneNode — Returns a new node that is a copy of this node.
- getAttribute — Gets the value of the named attribute.
- getAttributeNode — Gets the named attribute node.
- getElementsByTagName — Returns a list of all descendant elements that match the given name.
- hasChildNodes — Returns true if this node has children; false otherwise.
- insertBefore — Inserts a child node before the given node.
- normalize — Normalizes all descendent elements by combining two or more text nodes next to each other into one text node.
- removeAttribute — Removes or replaces the named attribute.
- removeAttributeNode — Removes the given attribute from the element.
- removeChild — Removes the given child node.
- replaceChild — Replaces the given child node with the given new child node.
- setAttribute — Sets the value of a named attribute.
- setAttributeNode — Adds or changes the given attribute node on the element.
- transformNode*— Transforms the node and its children by using the given XSL style sheet.
Using the XMLDOMAttribute Object
Attributes are considered nodes in the W3C DOM, but an attribute is not considered a child node of an element. As you'll see today, you use special methods to get the attributes of an element (for example, the getAttribute method). Here are the significant properties of the XMLDOMAttribute object:
- attributes — List of attributes for this node. Read-only.
- childNodes — Contains the list of the child nodes. Read-only.
- dataType*— Contains the data type of this node. Read/write.
- firstChild — Contains the first child of the current node. Read-only.
- lastChild — Contains the last child of the current node. Read-only.
- name — Contains the attribute name. Read-only.
- namespaceURI*— Contains the URI for the namespace. Read-only.
- nextSibling — Contains the next sibling of the node. Read-only.
- nodeName — Contains the qualified name for an element, attribute, or entity reference, or a string for other node types. Read-only.
- nodeType — Contains the node type. Read-only.
- nodeTypedValue*— Contains the node's value. Read/write.
- nodeTypeString*— Contains the node type, in string form. Read-only.
- nodeValue — Contains the text associated with the node. Read/write.
- ownerDocument — Contains the root of the document. Read-only.
- parentNode — Holds the parent node (for nodes that can have parents). Read-only.
- parsed*— Returns true if this node has been parsed; false otherwise. Read-only.
- prefix*— Contains the namespace prefix. Read-only.
- previousSibling — Contains the previous sibling of this node. Read-only.
- specified — Indicates whether the node (usually an attribute) is explicitly specified or derived from a default value. Read-only.
- text — Contains the text content of the node and its subtrees. Read/write.
- value — Contains the attribute's value. Read/write.
- xml — Contains the XML text representation of the node and all its descendants. Read-only.
Here are the significant methods of this object:
- appendChild — Appends a new child as the last child of this node.
- cloneNode — Returns a new node that is a copy of this node.
- hasChildNodes — Is set to true if this node has children.
- insertBefore — Inserts a child node before the given node.
- removeChild — Removes the given child node from the list.
- replaceChild — Replaces the given child node with the new child node.
- transformNode — Transforms this node and its children by using the given XSL style sheet.
Using the XMLDOMText Object
When it comes time to access the data in an XML document, you'll usually want to work with the text content of an element or an attribute, and you can use the Microsoft XMLDOMText object for text nodes. Here are the significant properties of the XMLDOMText object:
- attributes — Holds the list of attributes for the node. Read-only.
- childNodes — Contains the list of the child nodes. Read-only.
- data — Contains the node's data. What is actually stored depends on the node type. Read/write.
- dataType*— Contains the data type for the node. Read/write.
- firstChild — Contains the first child of the current node. Read-only.
- lastChild — Contains the last child of the current node. Read-only.
- length — Contains the length, in characters, of the data. Read-only.
- namespaceURI*— Contains the URI for the namespace. Read-only.
- nextSibling — Contains the next sibling of this node. Read-only.
- nodeName — Contains the qualified name of an element, attribute, or entity reference, or a string for other node types. Read-only.
- nodeType — Indicates the node type. Read-only.
- nodeTypedValue*— Contains the node's value. Read/write.
- nodeTypeString*— Contains the node type, in string form. Read-only.
- nodeValue — Contains the text associated with the node. Read/write.
- ownerDocument — Contains the root of the document. Read-only.
- parentNode — Contains the parent node. Read-only.
- parsed*— Returns true if this node has been parsed; false otherwise. Read-only.
- prefix*— Contains the namespace prefix. Read-only.
- previousSibling — Contains the previous sibling of this node. Read-only.
- specified — Indicates whether the node is explicitly specified or derived from a default value. Read-only.
- text*— Holds the text content of the node. Read/write.
- xml*— Holds the XML representation of the node and all of its descendants. Read-only.
Here are the significant methods of this object:
- appendChild — Appends a new child as the last child of the node.
- appendData — Appends the given string to the existing string data.
- cloneNode — Returns a new node that is a copy of this node.
- deleteData — Removes the given substring within the string data.
- hasChildNodes — Returns true if this node has children; false otherwise.
- insertBefore — Inserts a child node before the specified node.
- insertData — Inserts the supplied string at the specified offset.
- removeChild — Removes the specified child node from the list of children.
- replaceChild — Replaces the specified child node with the given new child node.
- splitText — Breaks the text node into two text nodes.
- substringData — Returns a substring of the full string.
- transformNode*— Transforms the node and its children by using the given XSL style sheet.
This overview of the JavaScript objects you'll be using today might seem somewhat mysterious, so in the following sections you'll put it to work.