- 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
Binding HTML Elements to HTML Data
Many of the HTML elements supported in Internet Explorer can be bound to DSOs. We use the DATASRC and DATAFLD attributes to bind an element to a DSO; to do so, we assign the DATASRC attribute to the name of a DSO and the DATAFLD attribute to the name of the data field we want to bind the element to. After it's been bound, the element will display the data in the current record in the DSO. In code, we can use the moveFirst, moveLast, moveNext, and movePrevious methods to make other records the current record, and the data in the bound elements is updated automatically.
Say, for instance, that we've bound an HTML text field to the states DSO and to the name field in the DSO's records. When the page first loads, that control will display the name "California". Executing the moveNext method will make the next record in the record set the current record, and the text field will display the name "Massachusetts".
Here's a list of HTML elements in Internet Explorer, indicating what elements may be bound and what property is bound when we use the DATASRC and DATAFLD attributes:
- A — Data is bound to the href property; changes are not automatically updated.
- APPLET — Data is bound to the param property; changes are automatically updated.
- BUTTON — Data is bound to the value property; changes are not automatically updated.
- DIV — Data is bound to the innerText and innerHTML properties; changes are not automatically updated.
- FRAME — Data is bound to the src property; changes are not automatically updated.
- IFRAME — Data is bound to the src property; changes are not automatically updated.
- IMG — Data is bound to the src property; changes are not automatically updated.
- INPUT TYPE=BUTTON — Data is bound to the value property; changes are not automatically updated.
- INPUT TYPE=CHECKBOX — Data is bound to the checked property; changes are automatically updated.
- INPUT TYPE=HIDDEN — Data is bound to the value property; changes are automatically updated.
- INPUT TYPE=PASSWORD — Data is bound to the value property; changes are automatically updated.
- INPUT TYPE=RADIO — Data is bound to the checked property; changes are automatically updated.
- INPUT TYPE=TEXT — Data is bound to the value property; changes are automatically updated.
- LABEL — Data is bound to the value property; changes are not automatically updated.
- MARQUEE — Data is bound to the innerText and innerHTML properties; changes are not automatically updated.
- OBJECT — Data is bound to the objects property; changes are automatically updated.
- PARAM — Data is bound to the param property; changes are automatically updated.
- SELECT — Data is bound to the text property of an option; changes are automatically updated.
- SPAN — Data is bound to the innerText and innerHTML properties; changes are not automatically updated.
- TABLE — This element constructs an entire table; changes are not automatically updated.
- TEXTAREA — Data is bound to the value property; changes are automatically updated.
Let's put all this to work. You'll start by creating a DSO and using it to read the data from ch19_01.html. You'll navigate through that data by using buttons. Begin by creating the DSO by using the <OBJECT> element, naming it states, and connecting it to your data file, ch19_01.html:
<HTML> <HEAD> <TITLE> Using the MSHTML Data Source Object </TITLE> </HEAD> <BODY> <H1> Using the MSHTML Data Source Object </H1> <OBJECT ID="states" DATA="ch19_01.html" HEIGHT="0" WIDTH="0"></OBJECT> . . .
Now connect the various data fields in the states DSO to HTML text fields by using the DATASRC and DATAFLD attributes—here's how that works for the name and population fields:
Name: <INPUT TYPE="TEXT" DATASRC="#states" DATAFLD="name" SIZE="10"> <BR><BR> Population: <INPUT TYPE="TEXT" DATASRC="#states" DATAFLD="population" SIZE="10">
You can also bind data to other elements. Here's how to bind the data in the capital and flower fields to the text in <SPAN> elements:
<BR><BR> Capital: <SPAN DATASRC="#states" DATAFLD="capital"></SPAN> <BR><BR> Flower: <SPAN DATASRC="#states" DATAFLD="flower"> </SPAN>
In fact, you can even bind the data in the bird fields to a <SELECT> control, which will display the state's bird by using a drop-down list:
<BR><BR> Bird: <SELECT DATASRC="#states" DATAFLD="bird" SIZE="1"> <OPTION VALUE="Quail">Quail <OPTION VALUE="Chickadee">Chickadee <OPTION VALUE="Bluebird">Bluebird </SELECT>
When this page first appears, the data from the first record will appear in the bound controls. To let the user navigate to other records, you can use buttons and some JavaScript. These buttons will display a caption of << to move to the first record, > to move to the next record, and so on. For example, to let the user navigate to the first record, you'll use the states DSO's record set's moveFirst method, like this:
<BR><BR> <BUTTON ONCLICK= "states.recordset.moveFirst()"> << </BUTTON>
To navigate to the previous record, first check whether you're at the beginning of the record set by checking whether the states.recordset.BOF property is true. If it is not, navigate to the previous record like this:
<BUTTON ONCLICK="if (!states.recordset.BOF) states.recordset.movePrevious()"> < </BUTTON>
Similarly, you can navigate to the next record if you're not already at the end of the record set, which you check by seeing whether the states.recordset.EOF property is true. If it is not, move to the next record with the moveNext method:
<BUTTON ONCLICK="if (!states.recordset.EOF) states.recordset.moveNext()"> > </BUTTON>
To move to the last record in the record set, use the moveLast method:
<BUTTON ONCLICK= "states.recordset.moveLast()"> >> </BUTTON>
Listing 19.2 shows the full code for your HTML DSO document (ch19_02.html).
Example 19.2. An HTML DSO Document (ch19_02.html)
<HTML> <HEAD> <TITLE> Using the MSHTML Data Source Object </TITLE> </HEAD> <BODY> <H1> Using the MSHTML Data Source Object </H1> <OBJECT ID="states" DATA="ch19_01.html" HEIGHT="0" WIDTH="0"></OBJECT> Name: <INPUT TYPE="TEXT" DATASRC="#states" DATAFLD="name" SIZE="10"> <BR><BR> Population: <INPUT TYPE="TEXT" DATASRC="#states" DATAFLD="population" SIZE="10"> <BR><BR> Capital: <SPAN DATASRC="#states" DATAFLD="capital"></SPAN> <BR><BR> Bird: <SELECT DATASRC="#states" DATAFLD="bird" SIZE="1"> <OPTION VALUE="Quail">Quail <OPTION VALUE="Chickadee">Chickadee <OPTION VALUE="Bluebird">Bluebird </SELECT> <BR><BR> Flower: <SPAN DATASRC="#states" DATAFLD="flower"> </SPAN> <BR><BR> <BUTTON ONCLICK= "states.recordset.moveFirst()"> << </BUTTON> <BUTTON ONCLICK="if (!states.recordset.BOF) states.recordset.movePrevious()"> < </BUTTON> <BUTTON ONCLICK="if (!states.recordset.EOF) states.recordset.moveNext()"> > </BUTTON> <BUTTON ONCLICK= "states.recordset.moveLast()"> >> </BUTTON> </BODY> </HTML>
Figure 19.1 shows ch19_02.html at work. As shown in the figure, the data from ch19_01.html is indeed bound to your controls. The user can move from record to record easily by using the buttons at the bottom of the page.
Figure 19.1 Data binding with the MSHTML control.
The record set object in a DSO has these properties:
- absolutePosition — Specifies the position of the current record in a record set.
- BOF — Is set to true if the current record position in a record set is the first record.
- cacheSize — Specifies the number of records from a record set that are cached locally.
- cursorLocation — Specifies the location of the record set cursor for the record set.
- editMode — Indicates whether editing is in progress.
- EOF — Is set to true if the current record is the last record in the record set.
- lockType — Specifies the type of database locking used.
- maxRecords — Specifies the maximum number of records a record set can contain.
- pageCount — Specifies the number of pages of data a record set contains.
- pageSize — Specifies the number of records that make up one page of data.
- recordCount — Specifies the number of records in the current record set.
- state — Indicates whether a record set is open or closed.
- status — Indicates the status of the current record.
- stayInSync — Indicates whether a hierarchical record set should stay in sync with the data source.
Here are the methods of the record set objects inside DSOs:
- addNew — You use this method to add a new record to the record set.
- cancel — You use this method to cancel execution of a pending Execute or Open request.
- cancelUpdate — You use this method to cancel an update operation.
- clone — You use this method to create a copy of the record set.
- close — You use this method to close a record set.
- delete — You use this method to delete the current record (or group of records).
- find — You use this method to search the record set. (Note that you use SQL to perform the search, which is not supported in Internet Explorer.)
- getRows — You use this method to read records and store them in an array.
- getString — You use this method to get the record set as a string.
- move — You use this method to move the position of the current record.
- moveFirst, moveLast, moveNext, and movePrevious — You use this method to navigate to various positions in the record set.
- nextRecordSet — You use this method to clear the current record set object and return the next record set when working with hierarchical record sets.
- open — You use this method to open a database.
- requery — You use this method to re-execute the command that created a record set.
- save — You use this method to save a record set in a file.
- supports — You use this method to determine the features the record set supports.
In addition, DSOs support a number of events we can handle in scripting code. Here they are:
- onDataAvailable — Occurs when data is downloaded.
- onDatasetChanged — Occurs when the record set is changed.
- onDatasetComplete — Occurs when the data is downloaded and ready to be used.
- onReadyStateChange — Occurs when the ReadyState property changes.
- onRowEnter — Occurs when a new record becomes the current one.
- onRowExit — Occurs just before exiting the current record.
- onRowsDelete — Occurs when a row is deleted.
- onRowsInserted — Occurs when a row is inserted.
- onCellChange — Occurs when the data in a bound control changes and the focus leaves that cell.
Now that we've explored how to do data binding in HTML, let's do this kind of data binding directly with XML.