selectsinglenode problem parsing xml in VB.net

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.  
alismanAsked:
Who is Participating?
 
Carl TawnSystems and Integration DeveloperCommented:
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)
0
 
Carl TawnSystems and Integration DeveloperCommented:
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.
0
 
alismanAuthor 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?
0
Cloud Class® Course: Ruby Fundamentals

This course will introduce you to Ruby, as well as teach you about classes, methods, variables, data structures, loops, enumerable methods, and finishing touches.

 
YZlatCommented:
n.SelectSingleNode(xpath) might be Nothing
0
 
YZlatCommented:
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
0
 
Carl TawnSystems and Integration DeveloperCommented:
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.
0
 
alismanAuthor 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">
0
 
YZlatCommented:
I think your xpath is incorrect
0
 
YZlatCommented:
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
0
 
YZlatCommented:
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
0
 
alismanAuthor Commented:
no dice.  this xpath expression is returning "Nothing"    ???

 Dim xpath = "//field[@name='first']"
0
 
alismanAuthor 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.
0
 
alismanAuthor Commented:
thank you very much carl.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.