We help IT Professionals succeed at work.

We've partnered with Certified Experts, Carl Webster and Richard Faulkner, to bring you two Citrix podcasts. Learn about 2020 trends and get answers to your biggest Citrix questions!Listen Now

x

selectsinglenode problem parsing xml in VB.net

Medium Priority
1,696 Views
Last Modified: 2013-11-19
Dim path = "......"
 Dim xmldoc As New XmlDocument

        Try

            xmldoc.Load(path)
            makeNewDataSet(xmldoc.DocumentElement("resultset"))
        Catch ex As Exception
        End Try

Then, in the subroutine "makenewdataset", I try to access values use selectsinglenode to grab field nodes by attribute "name"
n is a node representing a record.

Dim xpath = "/field[@name='first']"
Response.Write("--" & n.SelectSingleNode(xpath).InnerText)

This for some reason just shuts down the code.  It doesn't throw an error. It just mysteriously breaks a loop.  
Comment
Watch Question

Carl TawnSenior Systems and Integration Developer
CERTIFIED EXPERT

Commented:
It possibly is throwing an error. The exception will bubble to the calling method, which in your sample has nothing the the exception handler, so it will do nothing.

Can you provide a bit more info ? Maybe the rest of the makeNewDataSet method and a sample of the XML you are using.

Author

Commented:
you're right.   it was throwing an exception.  

Object reference not set to an instance of an object.

on this code:

Response.Write("--" & n.SelectSingleNode(xpath).InnerText)

why would it do that?
CERTIFIED EXPERT

Commented:
n.SelectSingleNode(xpath) might be Nothing
CERTIFIED EXPERT

Commented:
try replacing

Response.Write("--" & n.SelectSingleNode(xpath).InnerText)

with this

Dim node as XmlNode=n.SelectSingleNode(xpath)
If Not node Is Nothing Then
        Response.Write("--" & node.InnerText)
End if
Carl TawnSenior Systems and Integration Developer
CERTIFIED EXPERT

Commented:
As YZlat says, its probably not finding the node.

We'd need to see a sample of the XML to see why you're not getting anything.

Author

Commented:
here's the xml.   i just gave you the xml down to relevant node, which is record.   it is valid.   please ignore the dashes at the beginning of nodes.  those are from ieexplorer.   you'll see that records are childnodes of resultset.  i am passing the resultset node to the madedataset function.  thanks to all.

 <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
  <!DOCTYPE fmresultset (View Source for full doctype...)>
- <fmresultset xmlns="http://www.filemaker.com/xml/fmresultset" version="1.0">
  <error code="0" />
  <product build="03/01/2005" name="FileMaker Web Publishing Engine" version="7.0v5" />
  <datasource database="elected_officials_sync" date-format="MM/dd/yyyy" layout="elected_officials" table="elected_officials" time-format="HH:mm:ss" timestamp-format="MM/dd/yyyy HH:mm:ss" total-count="7923" />
- <metadata>
  <field-definition auto-enter="no" global="no" max-repeat="1" name="ID" not-empty="yes" result="number" type="normal" />
  <field-definition auto-enter="no" global="no" max-repeat="1" name="first" not-empty="no" result="text" type="normal" />
  <field-definition auto-enter="no" global="no" max-repeat="1" name="last" not-empty="no" result="text" type="normal" />
  <field-definition auto-enter="no" global="no" max-repeat="1" name="prefix" not-empty="no" result="text" type="normal" />
  <field-definition auto-enter="no" global="no" max-repeat="1" name="email" not-empty="no" result="text" type="normal" />
  <field-definition auto-enter="no" global="no" max-repeat="1" name="state" not-empty="no" result="text" type="normal" />
  <field-definition auto-enter="no" global="no" max-repeat="1" name="LD" not-empty="no" result="text" type="normal" />
  <field-definition auto-enter="no" global="no" max-repeat="1" name="kind" not-empty="no" result="text" type="normal" />
  <field-definition auto-enter="no" global="no" max-repeat="1" name="web" not-empty="no" result="text" type="normal" />
  <field-definition auto-enter="no" global="no" max-repeat="1" name="middle" not-empty="no" result="text" type="normal" />
  <field-definition auto-enter="no" global="no" max-repeat="1" name="emailMethod" not-empty="no" result="text" type="normal" />
  <field-definition auto-enter="no" global="no" max-repeat="1" name="emailformstring" not-empty="no" result="text" type="normal" />
  <field-definition auto-enter="no" global="no" max-repeat="1" name="address1" not-empty="no" result="text" type="normal" />
  <field-definition auto-enter="no" global="no" max-repeat="1" name="address2" not-empty="no" result="text" type="normal" />
  <field-definition auto-enter="no" global="no" max-repeat="1" name="city" not-empty="no" result="text" type="normal" />
  <field-definition auto-enter="no" global="no" max-repeat="1" name="zip" not-empty="no" result="text" type="normal" />
  <field-definition auto-enter="no" global="no" max-repeat="1" name="phone" not-empty="no" result="text" type="normal" />
  <field-definition auto-enter="no" global="no" max-repeat="1" name="fax" not-empty="no" result="text" type="normal" />
  <field-definition auto-enter="no" global="no" max-repeat="1" name="party" not-empty="no" result="text" type="normal" />
  <field-definition auto-enter="no" global="no" max-repeat="1" name="institution" not-empty="no" result="text" type="normal" />
  <field-definition auto-enter="no" global="no" max-repeat="1" name="suffix" not-empty="no" result="text" type="normal" />
  <field-definition auto-enter="no" global="no" max-repeat="1" name="active" not-empty="yes" result="number" type="normal" />
  <field-definition auto-enter="no" global="no" max-repeat="1" name="address_state" not-empty="no" result="text" type="normal" />
  <field-definition auto-enter="no" global="no" max-repeat="1" name="abbreviation" not-empty="no" result="text" type="normal" />
  <field-definition auto-enter="yes" global="no" max-repeat="1" name="creationDate" not-empty="no" result="timestamp" type="normal" />
  </metadata>
- <resultset count="7923" fetch-size="25">
- <record mod-id="0" record-id="23232">
- <field name="ID">
  <data>400001</data>
  </field>
- <field name="first">
  <data>James</data>
  </field>
- <field name="last">
  <data>Elkins</data>
  </field>
- <field name="prefix">
  <data>Representative</data>
  </field>
- <field name="email">
  <data>Rep_Jim_Elkins@legis.state.ak.us</data>
  </field>
- <field name="state">
  <data>AK</data>
  </field>
- <field name="LD">
  <data>AK_001</data>
  </field>
- <field name="kind">
  <data>SH</data>
  </field>
- <field name="web">
  <data>http://w3.legis.state.ak.us/house/24/ELN.php</data>
  </field>
- <field name="middle">
  <data>B.</data>
  </field>
- <field name="emailMethod">
  <data>e</data>
  </field>
- <field name="emailformstring">
CERTIFIED EXPERT

Commented:
I think your xpath is incorrect
CERTIFIED EXPERT

Commented:
try

Dim xpath = "//field[@name='first']"

Dim node as XmlNode=n.SelectSingleNode(xpath)
If Not node Is Nothing Then
        Response.Write("--" & node.InnerText)
End if
CERTIFIED EXPERT

Commented:
actually use this:

Dim xpath = "//field[@name='first']"

Dim node as XmlNode=n.SelectSingleNode(xpath)
Dim dataNode As XmlNode
If Not node Is Nothing Then
        dataNode=node.SelectSingleNode("data")
        Response.Write("--" & dataNode.InnerText)
End if

Author

Commented:
no dice.  this xpath expression is returning "Nothing"    ???

 Dim xpath = "//field[@name='first']"

Author

Commented:
the following lines of code work find:

Response.Write(n.ChildNodes.Item(0).Attributes(0).InnerText)

Response.Write(n.ChildNodes.Item(0).FirstChild.InnerText)


So, it's something wrong with the selectSingleNode and the xpath expression.
Senior Systems and Integration Developer
CERTIFIED EXPERT
Commented:
Its the old namespace problem again. You have a default namespace set for your document, which means that you need to use a NameSpaceManager in order to alias the namespace.

This is a sample of the process, you should be able to adapt your makeNewDataSet method to suit:

            XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable);
            ns.AddNamespace("x", "http://www.filemaker.com/xml/fmresultset");               // Apply prefix of 'x' to the namespace

            XmlNode node = doc.SelectSingleNode("//x:field[@name='first']", ns);             // Assuming an XmlDocument named doc
                                                                                                                              // Note the "x:" prefix in front of the node name
            Response.Write("--" & node.InnerText)

Not the solution you were looking for? Getting a personalized solution is easy.

Ask the Experts

Author

Commented:
thank you very much carl.
Access more of Experts Exchange with a free account
Thanks for using Experts Exchange.

Create a free account to continue.

Limited access with a free account allows you to:

  • View three pieces of content (articles, solutions, posts, and videos)
  • Ask the experts questions (counted toward content limit)
  • Customize your dashboard and profile

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.