Solved

How can I fill in missing XML elements with default values?

Posted on 2004-08-17
3
254 Views
Last Modified: 2012-05-05
I'm developing web applications for in-house use and designed to interact with Microsoft's Customer Relationship Management system. The way the CRM API works with respect to retrieving data is that you call the Retrieve method on a proxy object for the type of object you are trying to retrieve, and specify the guid of the actual instance of that object you are interested in.

For example (pseudocode) :

strOutput = oInvoice.Retrieve( user_authorization, invoiceGuid, elements_you_would_like_returned)

would return an XML string describing the specific invoice who's guid is 'invoiceGuid'. If you leave 'elements_you_would_like_returned', it returns the entire invoice.

HOWEVER (this is the root of my problem), if fields in the invoice object are blank (quite a common occurance), the XML element containing that column's information is missing.

An example:
Typically once the XML string is returned, it is loaded into an XmlDocument. If I wish to display the 'Bill To' address, for instance--

xmlDoc.LoadXML(strOutput) 'output from above
textbox1.Text = xmlDoc("invoice").Item("billto_city").InnerText

-- but if the billto_city field was left blank, this throws an 'Object reference not set to an instance of object' exception.

It is not really feasable to put this inside a Try-Catch block, as I would need to do this for every column in the Invoice object.

I DO have an xsd which describes the CRM Invoice, however, having done some research, I found at http://www.w3.org/TR/xmlschema-0/ that:
 "Default attribute values apply when attributes are missing, and default element values apply when elements are empty." That seems disheartening.

So my question is this: Is there any way to put missing XML elements into the returned string so the application wouldn't throw that exception when I try and print out all the values?

Thanks in advance for any help, and for reading that long and convoluted post.
-adlibdev
0
Comment
Question by:adlibdev
  • 2
3 Comments
 
LVL 26

Accepted Solution

by:
rdcpro earned 125 total points
ID: 11823282
One should *always* test for the presence of a node before attempting to access it.  For example, any method that returns a node should be tested to see if it returned null, before trying to look at the InnerText property.  Here's a javascript example (.NET isn't much different, though):

var oNode = xmlDoc.selectSingleNode("foo/bar/snafu");
sMyText = (oNode != null) ? oNode.text : "";

In this case, sMyText equals the value of the snafu element, if snafu exists, and is an empty string if it doesn't.

If you try to combine the two together, like:

sMyText = xmlDoc.selectSingleNode("foo/bar/snafu").text;

you're asking for trouble!  ;^)

But don't try to use try-catch blocks for this, because the overhead is high.

Regards,
Mike Sharp
0
 

Author Comment

by:adlibdev
ID: 11824551
That's not a bad way of doing it. Still a bit tedious, but I guess you can't have everything. Thanks for your help.
0
 
LVL 26

Expert Comment

by:rdcpro
ID: 11827032
Well, that's one of the reasons I like XSLT...

Regards,
Mike Sharp
0

Featured Post

Guide to Performance: Optimization & Monitoring

Nowadays, monitoring is a mixture of tools, systems, and codes—making it a very complex process. And with this complexity, comes variables for failure. Get DZone’s new Guide to Performance to learn how to proactively find these variables and solve them before a disruption occurs.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The Confluence of Individual Knowledge and the Collective Intelligence At this writing (summer 2013) the term API (http://dictionary.reference.com/browse/API?s=t) has made its way into the popular lexicon of the English language.  A few years ago, …
Many times as a report developer I've been asked to display normalized data such as three rows with values Jack, Joe, and Bob as a single comma-separated string such as 'Jack, Joe, Bob', and vice versa.  Here's how to do it. 
Although Jacob Bernoulli (1654-1705) has been credited as the creator of "Binomial Distribution Table", Gottfried Leibniz (1646-1716) did his dissertation on the subject in 1666; Leibniz you may recall is the co-inventor of "Calculus" and beat Isaac…
The Email Laundry PDF encryption service allows companies to send confidential encrypted  emails to anybody. The PDF document can also contain attachments that are embedded in the encrypted PDF. The password is randomly generated by The Email Laundr…

685 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question