Link to home
Start Free TrialLog in
Avatar of AlexPonnath
AlexPonnathFlag for United States of America

asked on

VB.NET XML Processing a XMLNodeList with Namespace

OK based on the below code we Load the Doc and get the 3 Call Nodes. My question now is how can i do the folowing things

a) Get a list of all sub nodes of this node
If posible so i could loop thru that list
b) Check if a specific node exists
<NPInfo>
c) Access data in a subnode for example how would i access the
<OrigParty>
<SubscriberAddr type="e164">+12095551122</SubscriberAddr>
</OrigParty>

Imports System.Xml
Imports System.Xml.XPath

Dim m_xmld As XmlDocument
Dim m_nodelist As XmlNodeList
Dim m_node As XmlElement

'Create the XML Document
m_xmld = New XmlDocument()
'Load the Xml file
m_xmld.Load("sample2.xml")

'' Added these two lines
Dim nsmgr = New XmlNamespaceManager(m_xmld.NameTable)
nsmgr.AddNamespace("ns", "http://www.metaswitch.com/cfs/billing/V1.0")

'Get the list of name nodes
'' Modified your XPath and added the second parameter 
m_nodelist = m_xmld.SelectNodes("/ns:File/ns:CDRs/ns:Call", nsmgr)
'Loop through the nodes

Open in new window

ASKER CERTIFIED SOLUTION
Avatar of YZlat
YZlat
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of AlexPonnath

ASKER

Ok, that answers 1 and 2 somewhat, but how about 3. Lets say i have the Node selected via
Dim thisNode As XmlNode = m_nodelist(temp).SelectSingleNode("ns:RoutingInfo", nsmgr)

Open in new window

The node looks like this
<RoutingInfo>
<RequestedAddr type="unknown">17145551212</RequestedAddr>
<DestAddr type="e164">+17145551212</DestAddr>
<RoutedAddr type="national">7145551212</RoutedAddr>
<CallingPartyRoutedAddr type="national">7145551212</CallingPartyRoutedAddr>
<CallingPartyOrigAddr type="national">7145551212</CallingPartyOrigAddr>
</RoutingInfo>

Open in new window

How can i get the Attribute (Type) and Value for <RoutedAddr>
type=thisNode.SelectSingleNode("//RouteAddr[@type]")
val=thisNode.SelectSingleNode("//RouteAddr").InnerText

Open in new window

This code seems to not work for doc with name space... it returns nothing
What if you add namespaces?

type=thisNode.SelectSingleNode("//ns:RouteAddr[@type]",, nsmgr)
val=thisNode.SelectSingleNode("//ns:RouteAddr", , nsmgr).InnerText

Open in new window

Still doesn't work, here is the code i used to test this code.. I also included sample data


    Dim m_xmld As XmlDocument
        Dim m_nodelist As XmlNodeList
        Dim m_node As XmlElement
        Try




            'Create the XML Document
            m_xmld = New XmlDocument()
            'Load the Xml file
            m_xmld.Load("C:\Documents\sample2.xml")

            '' Added these two lines
            Dim nsmgr = New XmlNamespaceManager(m_xmld.NameTable)
            nsmgr.AddNamespace("ns", "http://www.metaswitch.com/cfs/billing/V1.0")

            'Get the list of name nodes
            '' Modified your XPath and added the second parameter 
            m_nodelist = m_xmld.SelectNodes("/ns:File/ns:CDRs/ns:Call", nsmgr)
            'Loop through the nodes

            For temp As Integer = 0 To m_nodelist.Count - 1

                MsgBox(m_nodelist(temp).Attributes.GetNamedItem("seqnum").Value)

                Dim thisNode As XmlNode = m_nodelist(temp).SelectSingleNode("ns:RoutingInfo", nsmgr)


                If thisNode Is Nothing Then

                Else

                    MsgBox(thisNode.OuterXml)
                    MsgBox(thisNode.SelectSingleNode("//ns:RouteAddr[@type]", nsmgr))
                    MsgBox(thisNode.SelectSingleNode("//ns:RouteAddr", nsmgr).InnerText)

                End If

                For Each childnode As XmlNode In m_nodelist(temp)
                    MsgBox(childnode.Name)
                Next

            Next


            MsgBox(m_nodelist.Count)
        Catch ex As Exception
            Throw New Exception("Failed to load xml content. " & ex.Message)
        End Try

Open in new window

sample2.xml
What error are you getting and in what line?
If you run the code, there is no error . The problem is it does not return any of the values of those nodes. So we never get any data for the routeaddr
I know what the issue is. Replace the following lines:

nsmgr.AddNamespace("ns", "http://www.metaswitch.com/cfs/billing/V1.0")

            'Get the list of name nodes
            '' Modified your XPath and added the second parameter 
            m_nodelist = m_xmld.SelectNodes("/ns:File/ns:CDRs/ns:Call", nsmgr)

Open in new window


with

nsmgr.AddNamespace("xsi", "http://www.metaswitch.com/cfs/billing/V1.0")

            'Get the list of name nodes
            '' Modified your XPath and added the second parameter 
            m_nodelist = m_xmld.SelectNodes("//xsi:Call", nsmgr)

Open in new window


You just used incorrect namespace
that has no impact at all still returns the empty value. in both case the innerXML and OuterXML for the node is the same before changing your code and after

"<RequestedAddr type=""unknown"" xmlns=""http://www.metaswitch.com/cfs/billing/V1.0"">12095551212</RequestedAddr><DestAddr type=""e164"" xmlns=""http://www.metaswitch.com/cfs/billing/V1.0"">+12095551212</DestAddr><RoutedAddr type=""national"" xmlns=""http://www.metaswitch.com/cfs/billing/V1.0"">2095551212</RoutedAddr><CallingPartyRoutedAddr type=""national"" xmlns=""http://www.metaswitch.com/cfs/billing/V1.0"">2095551212</CallingPartyRoutedAddr><CallingPartyOrigAddr type=""national"" xmlns=""http://www.metaswitch.com/cfs/billing/V1.0"">2095551212</CallingPartyOrigAddr>"

           OuterXml      
<RoutingInfo xmlns=""http://www.metaswitch.com/cfs/billing/V1.0""><RequestedAddr type=""unknown"">12095551212</RequestedAddr><DestAddr type=""e164"">+12095551212</DestAddr><RoutedAddr type=""national"">2095551212</RoutedAddr><CallingPartyRoutedAddr type=""national"">2095551212</CallingPartyRoutedAddr><CallingPartyOrigAddr type=""national"">2095551212</CallingPartyOrigAddr></RoutingInfo>"      String


User generated image
I tire dit on a sample file you have sent me. This looks very different
Ok, i got a bit further and found one problem which was a typo on my side i had one of the node names wrong / missing the "d" in RoutedAddr. After fixing that and resetting my code to the original i get now the inner Text of   "thisNode.SelectSingleNode("ns:RoutedAddr", nsmgr).InnerText" but the "thisNode.SelectSingleNode("ns:RoutedAddr[@type]", nsmgr).Value' still returns a blank value even so i have a value in the XML file
change it to:

thisNode.SelectSingleNode("//ns:RoutedAddr[@type]", nsmgr).Value

Open in new window

Still nothing, both return blank
SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Wow, finaly we figured out this beast..
It returns now the correct value for Type
Thanks