Supplement to 'Converting Shaped Recordsets into XML'

,

Supplement to 'Converting Shaped Recordsets into XML'

In early June, I wrote a brief article titled

Converting Shaped Recordsets into XML,

describing several applications

for converting a shaped recordset to XML and a quick 'How To'. In response

to several individuals' requests, I am writing this sequel to that article. This

article will elaborate on several of the methods discussed in my previous article

as well as incorporate some further examples.

To give a quick summary, the last article explained how using ADO, the

Shape Provider and the XML DOM, a recordset could be persisted into XML format.

This provided a way for users to maintain the hierarchy returned by the shaped recordset

and simultaneouly, have the flexiblility to display the generated XML in any desired

format by transforming it using an XSL stylesheet. I also briefly discussed, some comparisons

between using the XML DOM versus ADO to parse the hierarchical recordset/XML.

I'd first like to address using the XML DOM to navigate the XML document. Below is an expanded example

of the code from my previous article. (The examples will use the Northwind database).

Sub ProcessCustomerOrders()
Dim conn 
Dim rs 
Dim XMLObj 
Dim SqlString 
Set conn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.Recordset")
Set XMLObj = Server.CreateObject("MSXML2.DOMDocument")
conn.ConnectionString = "Provider=MSDataShape.1;....."
conn.Open
SqlString = "SHAPE {Select * from Customers} " & _
"APPEND ({Select * from Orders} as rsOrders " & _
"RELATE CustomerID to CustomerID)"
rs.Open SqlString, conn, adOpenDynamic, adLockOptimistic
'Save recordset out to the XML DOM
rs.Save XMLObj, adPersistXML
Response.Write XMLObj.xml
Call GetElements(XMLObj)
Set XMLObj = Nothing
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
End Sub

In this example, I am saving the shaped recordset out to the XML DOM, then

writing out the resultant XML to the browser window. The XML should look like this:

<xml>
<rs:data>
<z:row CustomerID="SIMOB" CompanyName="Simons bistro" .....>
<rsOrders OrderID="10341" CustomerID="SIMOB" ...../>
<rsOrders OrderID="10417" CustomerID="SIMOB" ...../>
<rsOrders OrderID="10556" CustomerID="SIMOB" ...../>
<rsOrders OrderID="10642" CustomerID="SIMOB" ...../>
<rsOrders OrderID="10669" CustomerID="SIMOB" ...../>
<rsOrders OrderID="10802" CustomerID="SIMOB" ...../>
<rsOrders OrderID="11074" CustomerID="SIMOB" ...../>
</z:row>
</rs:data>
<rs:data>
.
.
.
</rs:data>
.
.
.
</xml>

So now we have our XML and we can see that the shaped recordset's hierarchy

is maintained. Now, what if we wanted to return only the Order or Customer information?

We can use the XML DOM to navigate our XML to return the desired information.

In the example below, I will return the OrderID and CustomerID attribute values from the 'rsOrders' nodes using the same XML DOM object

used in the above example.

Sub GetElements(XMLObj)
Dim Order 
Dim Customer 
Dim J 
Dim iNodeListOrders 
 
Set iNodeListOrders = XMLObj.getElementsByTagName("rsOrders")
      
For J = 0 To iNodeListOrders.length - 1
      Order = iNodeListOrders.Item(J).Attributes.getNamedItem("OrderID").Text
      Customer = iNodeListOrders.Item(J).Attributes.getNamedItem("CustomerID").Text
      'Process order information
      Call SomeProcess(Order, Customer)
Next
End Sub

Now we've parsed our XML. The Order and Customer information we've just created

is nothing special to look at, but as shown

in the above example, once the information is obtained, it can be easily processed.

So far, we've seen how easily we can parse the XML and retrieve any

information we'd like using the XML DOM. One last item I'd like to address

before moving on to parsing the shaped recordset using ADO, is transforming

the XML by attaching a simple XSL stylesheet.

Dim NewXML
NewXML = XMLObj.transformNode(XSLStyleSheet)
Response.Write NewXML

By simply adding the lines of code above to the ProcessCustomerOrders sub, the XML

can be transformed to look like anything we want.

Here is an example of what the results might look like:

Orders

Customer SIMOB

     Order number: 10341

     Order number: 10417

     Order number: 10556

So up until now, we used soley the XML DOM to parse and display our desired XML

and output. Using our existing query and recordset, lets take a look at how to parse it using ADO.

For this example, I will return the CustomerID, CompanyName and OrderID.

While Not rs.EOF
    'Write the customer id and company name to the browser
    Response.Write rs.Fields("CustomerID") & ", " &  rs.Fields("CompanyName") & "<br>"
    'create a new recordset containing the child Order rows belonging to the current customer
    Set rsOrders = rs("rsOrders").Value
    'loop through the Orders
    While Not rsOrders.EOF
        'Write the Order number to the browser
        Response.Write rsOrders("OrderID") & "<br>"
        rsOrders.MoveNext
    Wend
    rsOrders.Close
    Set rsOrder = Nothing
    rs.MoveNext
Wend

Here are the results:

ALFKI, Alfreds Futterkiste
 10643 
 10692 
 10702 
 10835 
 10952 
 11011 
ANATR, Ana Trujillo Emparedados y helados
.
.
.

As you can see, we can return very similar results as we did using the XML DOM

and a stylesheet. In fact, we can achieve identical results. So which method

should you use? Just as in the garage workshop, you want to use the right tool for the

right job. In some cases, ADO will offer an advantage and other times the XML DOM will

provide the more elegant solution.

So what are some pros and cons of using the XML DOM versus ADO to parse a

shaped recordset?

While the above example looks rather simple, picture a shaped recordset with many different

hierarchies. The more complex the relationships between tables, the more nested the

above example would become. In addition, displaying a sophisticated interface to the data becomes

very complex and can often times become bound to the data. On the other hand, using the XML DOM allows us some

additional flexibility. With the XML DOM, multiple node lists can be created

to segregate information and easily retrieve information no matter the complexity

of the relationships. In addition, by using the XML DOM, we can transform the XML

for use by many other applications.

Despite XML's benefits, ADO is the better tool in certain situations. If I had a simple hierarchy, ADO provides

me a fast method for parsing and retrieving data. If there was no need to display the data,

but only process it, ADO most likely would be the better tool. Also, by employing recursive

programming techniques, you could use ADO to parse a fairly complex shaped recordset. And using the XML DOM does have its

drawbacks. There is a large amount of overhead incurred when using the XML DOM. Also, when it comes

to speed, ADO still supasses the XML DOM.

I hope this article was helpful and insightful. If you are interested in learning more about XML,

please see my homepage for links to my other articles.

In addition, Leon Platt has written a teriffic article title XML in 20 minutes.

Just to restate, the purpose of this article was not to suggest

one method over another, but to highlight the alternatives that the XML DOM offers to ADO.

As I mentioned in my related article, try and find a useful application for this

technology.

Rate

Share

Share

Rate