Home > Articles > Web Services > XML

This chapter is from the book

This chapter is from the book

18.7 -Example: XML Schema Tree

Now that we have examined some of the features of the Microsoft XML Core Services, we can pull these concepts together in a single application. To illustrate the XML Schema features of MSXML, you can build a simple tool in Visual Basic to examine an XML schema document and validate documents against it.

Before building the project, you must have already installed the MSXML 4.0 components on the development machine. You can find these components, which are both free and redistributable, at the Microsoft Developer Network site, specifically at:

http://msdn.microsoft.com/downloads/sample.asp?url=/MSDN-FILES/027/ 001/766/msdncompositedoc.xml

After you have downloaded and executed the installation, you can develop applications by using MSXML.

The XML Schema Tree sample was created in Visual Basic 6.0 as a Standard Executable project. The project has a single form, SchemaTreeForm, that provides menus and displays the schema information. The sample code can be downloaded from

http://www.XMLSchemaReference.com/examples/Ch18. 

Figure 18.4 shows the design-time view of the SchemaTreeForm. It consists of a menu, a tree view, an image list, and a common dialog control.

To create this project, first select a new Standard Executable. Next you must include the necessary components to build the project. The project requires three additional libraries: MSXML 4.0, the Microsoft Common Dialog Control, and the Microsoft Windows Common Controls. The Microsoft Common Dialog Control contains the common file Open/Save dialog box used in Windows applications, and the Common Controls library holds both the tree view and the image list controls. To load these into your application, you must configure the project file to use them. You can add MSXML support to this project just as shown in Figure 18.2. Under the Visual Basic menu, select the Project menu, and then select References to add the MSXML 4.0 components. Add the other two libraries in a similar fashion: From the Project\Components check list, select both the Microsoft Common Dialog Control and the Microsoft Windows Common Controls.

Figure 18.4 FIGURE 18.4 XML Schema Tree form at design time.


Depending on the system you are running, you might have different versions of the Common Dialog and Common Controls libraries. The feature set used in this application is common to all versions of these libraries, so just select the ones available on your machine.

Now that you have configured your project to use all the necessary libraries, you can examine the application. The tree view, treeSchema, displays the schema contents whenever the File\Open Schema menu item is selected. The application fills the tree with items for the various element types, attribute types, and other parts of the XML schema. The other menu items let users select an XML document to be validated against the loaded schema, by using either the DOM or SAX2 features. The common dialog box allows users to browse for files, and the image list provides icons for the tree view items.

The code for the Schema Tree application is shown in the following listings. Listing 18.12 begins the code for the form shown in Figure 18.4. Loading and selecting an XML schema file and resizing the windows are handled here in code.

LISTING 18.12 SchemaTreeForm.frm Code Part 1

'SchemaTreeForm.frm
'
'Tree view representation of an XML schema using MSXML and SOM

Private m_schemaCache As XMLSchemaCache40

Private Sub Form_Load()
    status.SimpleText = "No schema"
    Set m_schemaCache = Nothing
End Sub

Private Sub Form_Resize()
    treeSchema.Move 0, 0, Me.ScaleWidth, Me.ScaleHeight
End Sub

Private Sub IDM_FILEEXIT_Click()
    Set m_schemaCache = Nothing
    Unload Me
End Sub

Private Sub IDM_FILEOPEN_Click()
On Error GoTo OpenErr
    status.SimpleText = "Working.."
    treeSchema.Nodes.Clear
    Set m_schemaCache = New XMLSchemaCache40
    Dim docSchema As DOMDocument40
    Dim schema As ISchema
    Dim strTargetNS As String
    Set docSchema = New DOMDocument40
    docSchema.async = False
    docSchema.validateOnParse = False
    Dim strFile As String
    filedlg.ShowOpen
    If filedlg.FileName = "" Then Exit Sub
    strFile = filedlg.FileName
    If (docSchema.Load(strFile)) Then
        status.SimpleText = "Loaded " & strFile
    Else
        Dim docError As IXMLDOMParseError
        MsgBox docError.reason, vbCritical, "Schema Tree"
        Exit Sub
    End If
    Dim elemDoc As IXMLDOMElement
    Dim attr As IXMLDOMAttribute
    Set elemDoc = docSchema.documentElement
    Set attr = elemDoc.getAttributeNode("targetNamespace")
    strTargetNS = ""
    If attr Is Nothing = False Then
        strTargetNS = attr.Value
    End If
    m_schemaCache.Add strTargetNS, docSchema
    Set schema = m_schemaCache.getSchema(strTargetNS)
    FillSchemaTree schema, treeSchema
    Exit Sub
OpenErr:
    MsgBox Err.Description, vbCritical, "Schema Tree"
    status.SimpleText = "No schema"
    Set m_schemaCache = Nothing
    Exit Sub
End Sub

Listing 18.13 continues the form code. The subroutine FillSchemaTree uses the SOM to traverse the contents of the XML schema and load each set of parts into the tree view. Beginning with the ISchema interface, this routine accesses the properties of ISchema and walks the returned ISchemaItemCollection interfaces.

LISTING 18.13 SchemaTreeForm.frm Code Part 2

'Fill a standard TreeView with a tree representation of an XML
' Schema as returned by the MSXML SOM ISchema interface
'This code currently only loads the list of elements, 
' attributes, and types
Public Sub FillSchemaTree(schema As ISchema, tree As TreeView)
    If schema Is Nothing Then Exit Sub
    If tree Is Nothing Then Exit Sub
    tree.Nodes.Clear
    Dim nodeRoot As Node
    Dim nodeCurr As Node
    Dim strRoot As String
    strRoot = schema.Name
    If strRoot = "" Then strRoot = "<schema>"
    Set nodeRoot = tree.Nodes.Add(,,, strRoot, 1)
    'Elements
    Dim nodeElemGroup As Node
    Set nodeElemGroup = tree.Nodes.Add(nodeRoot.Index, _
     tvwChild, , "<elements>", 2)
    Dim elem As ISchemaElement
    For Each elem In schema.elements
        Dim nodeElem As Node
        Set nodeElem = tree.Nodes.Add(nodeElemGroup.Index, _
         tvwChild,, elem.Name, 2)
    Next elem

    'Attributes
    Dim nodeAttrGroup As Node
    Set nodeAttrGroup = tree.Nodes.Add(nodeRoot.Index, _
     tvwChild,, "<attributes>", 3)

    Dim attr As ISchemaAttribute
    For Each attr In schema.Attributes
    Dim nodeAttr As Node
    Set nodeAttr = tree.Nodes.Add(nodeAttrGroup.Index, _
     tvwChild,, attr.Name, 3)
    Next attr

    'Types
    Dim nodeTypeGroup As Node
    Set nodeTypeGroup = tree.Nodes.Add(nodeRoot.Index, _
     tvwChild,, "all types", 5)

    Dim nodeSimpleTypeGroup As Node
    Set nodeSimpleTypeGroup = tree.Nodes.Add(_
     nodeTypeGroup.Index, tvwChild,, "simple types", 5)

    Dim nodeComplexTypeGroup As Node
    Set nodeComplexTypeGroup = tree.Nodes.Add(_
     nodeTypeGroup.Index, tvwChild,, "complex types", 4)

    Dim t As ISchemaType
    For Each t In schema.types
        Dim nodeType As Node
        If t.itemType = SOMITEM_COMPLEXTYPE Then
            Dim ct As ISchemaComplexType
            Set ct = Nothing
            Set ct = t
            Set nodeType = tree.Nodes.Add(_
             nodeComplexTypeGroup.Index, tvwChild,,_
             t.Name, 4)
        End If
      
        If t.itemType = SOMITEM_SIMPLETYPE Then
            Set nodeType = tree.Nodes.Add(_
             nodeSimpleTypeGroup.Index, tvwChild,, t.Name, 5)
        End If
    Next t

    'Expand the schema element
    nodeRoot.Expanded = True
End Sub

Listing 18.14 shows the last portion of form code: the menu handlers for the validation. These routines handle the validation by DOM or SAX, respectively. For both validations, the XMLSchemaCache40 is used to select the schemas in question. The DOM validation uses the schemas property of the DOMDocument40, whereas the SAX2 validation uses the getProperty method of SAXXMLReader40. In addition, in both cases you must make sure validation is active. When using the DOM, you activate validation using the validateOnParse property, and when using SAX, the getFeature method is used.

LISTING 18.14 SchemaTreeForm.frm Code Part 3

Private Sub IDM_FILEVALIDATEDOM_Click()
    Dim doc As DOMDocument40
    Dim docError As IXMLDOMParseError
    If m_schemaCache Is Nothing Then
        MsgBox "No schema is loaded", vbCritical, "Schema Tree"
        Exit Sub
    End If
    Set doc = New DOMDocument40
    doc.async = False
    doc.validateOnParse = True
    Set doc.schemas = m_schemaCache
    Dim strFile As String
    filedlg.ShowOpen
    If filedlg.FileName = "" Then Exit Sub
    strFile = filedlg.FileName
    Dim b As Boolean
    b = doc.Load(strFile)
    Set docError = doc.parseError
    If (docError.errorCode = 0) Then
        MsgBox _
         "The document is valid according to the schema.", _
         vbOKOnly, "Schema Tree"
    Else
        MsgBox docError.reason, vbCritical, "Schema Tree"
    End If
    Set doc = Nothing
End Sub

Private Sub IDM_FILEVALIDATESAX_Click()
On Error GoTo SaxErr
    Dim sax As SAXXMLReader40
    If m_schemaCache Is Nothing Then
        MsgBox "No schema is loaded", vbCritical, "Schema Tree"
        Exit Sub
    End If
    Set sax = New SAXXMLReader40
    Dim handler As SAXTest
    Set handler = New SAXTest
    Dim strFile As String
    filedlg.ShowOpen
    If filedlg.FileName = "" Then Exit Sub
    strFile = filedlg.FileName
    sax.putFeature "schema-validation", True
    sax.putProperty "schemas", m_schemaCache
    Set sax.contentHandler = handler
    Set sax.errorHandler = handler
    sax.parseURL strFile
    Exit Sub
SaxErr:
    MsgBox Err.Description
    Exit Sub
End Sub

The validation is determined by the errors—or lack thereof—that occur during parsing. Once again, DOM code just checks the parseError, whereas SAX2 relies on the handlers being used. The handler for the Schema Tree application is a Visual Basic class defined in Listing 18.15. This class, SAXTest, resembles the handler shown in Listing 18.4. With both content and error handling combined in the SAXTest class, the SAXTest class receives all the notifications needed to validate with SAX. Just as in Listing 18.4, the handler has a number of empty methods that exist only to make sure you fully implement the interfaces you support.

LISTING 18.15 SAXTest.cls (SAX Validation Handler)

'SAXTest
'SAX Handler for XML Schema Validation

Implements IVBSAXContentHandler
Implements IVBSAXErrorHandler

Private Sub IVBSAXContentHandler_characters(strChars As String)

End Sub

Private Property Set IVBSAXContentHandler_documentLocator(_
 ByVal RHS As MSXML2.IVBSAXLocator)

End Property

' Document is validated against the XML Schema
Private Sub IVBSAXContentHandler_endDocument()
    MsgBox "The document is valid according to the schema.", _
     vbOKOnly, "Schema Tree"
End Sub

Private Sub IVBSAXContentHandler_endElement(_
 strNamespaceURI As String, strLocalName As String, 
 strQName As String)

End Sub

Private Sub IVBSAXContentHandler_endPrefixMapping(_
 strPrefix As String)

End Sub

Private Sub IVBSAXContentHandler_ignorableWhitespace(_
 strChars As String)

End Sub

Private Sub IVBSAXContentHandler_processingInstruction(_
 strTarget As String, strData As String)

End Sub

Private Sub IVBSAXContentHandler_skippedEntity(_
 strName As String)

End Sub

Private Sub IVBSAXContentHandler_startDocument()

End Sub

Private Sub IVBSAXContentHandler_startElement(_
 strNamespaceURI As String, strLocalName As String, _
 strQName As String, _
 ByVal oAttributes As MSXML2.IVBSAXAttributes)

End Sub

Private Sub IVBSAXContentHandler_startPrefixMapping(_
 strPrefix As String, strURI As String)

End Sub

' Validation failed for the reason indicated by parameters
Private Sub IVBSAXErrorHandler_error(_
 ByVal oLocator As MSXML2.IVBSAXLocator, _
 strErrorMessage As String, ByVal nErrorCode As Long)
    MsgBox strErrorMessage, vbCritical, "Schema Tree"
End Sub

Private Sub IVBSAXErrorHandler_fatalError(_
 ByVal oLocator As MSXML2.IVBSAXLocator, _
 strErrorMessage As String, ByVal nErrorCode As Long)
    MsgBox strErrorMessage, vbCritical, "Schema Tree"
End Sub

Private Sub IVBSAXErrorHandler_ignorableWarning(_
 ByVal oLocator As MSXML2.IVBSAXLocator, _
 strErrorMessage As String, ByVal nErrorCode As Long)

End Sub 

With this code, we have a minimal XML schema explorer and document validator. Figures 18.5 and 18.6 show the XML Schema Tree loading an XML schema. Items in the tree are given different locations and icons depending on their types. This user interface provides a view of the schema hierarchy.

Figure 18.5 FIGURE 18.5 XML Schema Tree in action.


Figure 18.6 FIGURE 18.6 Validation error for badaddress.xml.


When you load the XML document badaddress.xml, the validation code fails because of the missing customerID attribute in that document. Figure 18.6 shows the message box displayed by the XML Schema Tree application when badaddress.xsd fails to validate against the address schema. This error is caught using the same error-checking code shown in Listing 18.15.

InformIT Promotional Mailings & Special Offers

I would like to receive exclusive offers and hear about products from InformIT and its family of brands. I can unsubscribe at any time.

Overview


Pearson Education, Inc., 221 River Street, Hoboken, New Jersey 07030, (Pearson) presents this site to provide information about products and services that can be purchased through this site.

This privacy notice provides an overview of our commitment to privacy and describes how we collect, protect, use and share personal information collected through this site. Please note that other Pearson websites and online products and services have their own separate privacy policies.

Collection and Use of Information


To conduct business and deliver products and services, Pearson collects and uses personal information in several ways in connection with this site, including:

Questions and Inquiries

For inquiries and questions, we collect the inquiry or question, together with name, contact details (email address, phone number and mailing address) and any other additional information voluntarily submitted to us through a Contact Us form or an email. We use this information to address the inquiry and respond to the question.

Online Store

For orders and purchases placed through our online store on this site, we collect order details, name, institution name and address (if applicable), email address, phone number, shipping and billing addresses, credit/debit card information, shipping options and any instructions. We use this information to complete transactions, fulfill orders, communicate with individuals placing orders or visiting the online store, and for related purposes.

Surveys

Pearson may offer opportunities to provide feedback or participate in surveys, including surveys evaluating Pearson products, services or sites. Participation is voluntary. Pearson collects information requested in the survey questions and uses the information to evaluate, support, maintain and improve products, services or sites, develop new products and services, conduct educational research and for other purposes specified in the survey.

Contests and Drawings

Occasionally, we may sponsor a contest or drawing. Participation is optional. Pearson collects name, contact information and other information specified on the entry form for the contest or drawing to conduct the contest or drawing. Pearson may collect additional personal information from the winners of a contest or drawing in order to award the prize and for tax reporting purposes, as required by law.

Newsletters

If you have elected to receive email newsletters or promotional mailings and special offers but want to unsubscribe, simply email information@informit.com.

Service Announcements

On rare occasions it is necessary to send out a strictly service related announcement. For instance, if our service is temporarily suspended for maintenance we might send users an email. Generally, users may not opt-out of these communications, though they can deactivate their account information. However, these communications are not promotional in nature.

Customer Service

We communicate with users on a regular basis to provide requested services and in regard to issues relating to their account we reply via email or phone in accordance with the users' wishes when a user submits their information through our Contact Us form.

Other Collection and Use of Information


Application and System Logs

Pearson automatically collects log data to help ensure the delivery, availability and security of this site. Log data may include technical information about how a user or visitor connected to this site, such as browser type, type of computer/device, operating system, internet service provider and IP address. We use this information for support purposes and to monitor the health of the site, identify problems, improve service, detect unauthorized access and fraudulent activity, prevent and respond to security incidents and appropriately scale computing resources.

Web Analytics

Pearson may use third party web trend analytical services, including Google Analytics, to collect visitor information, such as IP addresses, browser types, referring pages, pages visited and time spent on a particular site. While these analytical services collect and report information on an anonymous basis, they may use cookies to gather web trend information. The information gathered may enable Pearson (but not the third party web trend services) to link information with application and system log data. Pearson uses this information for system administration and to identify problems, improve service, detect unauthorized access and fraudulent activity, prevent and respond to security incidents, appropriately scale computing resources and otherwise support and deliver this site and its services.

Cookies and Related Technologies

This site uses cookies and similar technologies to personalize content, measure traffic patterns, control security, track use and access of information on this site, and provide interest-based messages and advertising. Users can manage and block the use of cookies through their browser. Disabling or blocking certain cookies may limit the functionality of this site.

Do Not Track

This site currently does not respond to Do Not Track signals.

Security


Pearson uses appropriate physical, administrative and technical security measures to protect personal information from unauthorized access, use and disclosure.

Children


This site is not directed to children under the age of 13.

Marketing


Pearson may send or direct marketing communications to users, provided that

  • Pearson will not use personal information collected or processed as a K-12 school service provider for the purpose of directed or targeted advertising.
  • Such marketing is consistent with applicable law and Pearson's legal obligations.
  • Pearson will not knowingly direct or send marketing communications to an individual who has expressed a preference not to receive marketing.
  • Where required by applicable law, express or implied consent to marketing exists and has not been withdrawn.

Pearson may provide personal information to a third party service provider on a restricted basis to provide marketing solely on behalf of Pearson or an affiliate or customer for whom Pearson is a service provider. Marketing preferences may be changed at any time.

Correcting/Updating Personal Information


If a user's personally identifiable information changes (such as your postal address or email address), we provide a way to correct or update that user's personal data provided to us. This can be done on the Account page. If a user no longer desires our service and desires to delete his or her account, please contact us at customer-service@informit.com and we will process the deletion of a user's account.

Choice/Opt-out


Users can always make an informed choice as to whether they should proceed with certain services offered by InformIT. If you choose to remove yourself from our mailing list(s) simply visit the following page and uncheck any communication you no longer want to receive: www.informit.com/u.aspx.

Sale of Personal Information


Pearson does not rent or sell personal information in exchange for any payment of money.

While Pearson does not sell personal information, as defined in Nevada law, Nevada residents may email a request for no sale of their personal information to NevadaDesignatedRequest@pearson.com.

Supplemental Privacy Statement for California Residents


California residents should read our Supplemental privacy statement for California residents in conjunction with this Privacy Notice. The Supplemental privacy statement for California residents explains Pearson's commitment to comply with California law and applies to personal information of California residents collected in connection with this site and the Services.

Sharing and Disclosure


Pearson may disclose personal information, as follows:

  • As required by law.
  • With the consent of the individual (or their parent, if the individual is a minor)
  • In response to a subpoena, court order or legal process, to the extent permitted or required by law
  • To protect the security and safety of individuals, data, assets and systems, consistent with applicable law
  • In connection the sale, joint venture or other transfer of some or all of its company or assets, subject to the provisions of this Privacy Notice
  • To investigate or address actual or suspected fraud or other illegal activities
  • To exercise its legal rights, including enforcement of the Terms of Use for this site or another contract
  • To affiliated Pearson companies and other companies and organizations who perform work for Pearson and are obligated to protect the privacy of personal information consistent with this Privacy Notice
  • To a school, organization, company or government agency, where Pearson collects or processes the personal information in a school setting or on behalf of such organization, company or government agency.

Links


This web site contains links to other sites. Please be aware that we are not responsible for the privacy practices of such other sites. We encourage our users to be aware when they leave our site and to read the privacy statements of each and every web site that collects Personal Information. This privacy statement applies solely to information collected by this web site.

Requests and Contact


Please contact us about this Privacy Notice or if you have any requests or questions relating to the privacy of your personal information.

Changes to this Privacy Notice


We may revise this Privacy Notice through an updated posting. We will identify the effective date of the revision in the posting. Often, updates are made to provide greater clarity or to comply with changes in regulatory requirements. If the updates involve material changes to the collection, protection, use or disclosure of Personal Information, Pearson will provide notice of the change through a conspicuous notice on this site or other appropriate way. Continued use of the site after the effective date of a posted revision evidences acceptance. Please contact us if you have questions or concerns about the Privacy Notice or any objection to any revisions.

Last Update: November 17, 2020