Solved

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

Posted on 2004-08-17
3
247 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

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

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

Suggested Solutions

Browsing the questions asked to the Experts of this forum, you will be amazed to see how many times people are headaching about monster regular expressions (regex) to select that specific part of some HTML or XML file they want to extract. The examp…
I was working on a PowerPoint add-in the other day and a client asked me "can you implement a feature which processes a chart when it's pasted into a slide from another deck?". It got me wondering how to hook into built-in ribbon events in Office.
Windows 10 is mostly good. However the one thing that annoys me is how many clicks you have to do to dial a VPN connection. You have to go to settings from the start menu, (2 clicks), Network and Internet (1 click), Click VPN (another click) then fi…
Learn how to create flexible layouts using relative units in CSS.  New relative units added in CSS3 include vw(viewports width), vh(viewports height), vmin(minimum of viewports height and width), and vmax (maximum of viewports height and width).

910 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

Need Help in Real-Time?

Connect with top rated Experts

25 Experts available now in Live!

Get 1:1 Help Now