Avatar of AlexPonnath
AlexPonnath
Flag 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

Visual Basic.NETXML

Avatar of undefined
Last Comment
AlexPonnath

8/22/2022 - Mon
ASKER CERTIFIED SOLUTION
YZlat

THIS SOLUTION ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
See Pricing Options
Start Free Trial
GET A PERSONALIZED SOLUTION
Ask your own question & get feedback from real experts
Find out why thousands trust the EE community with their toughest problems.
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>
YZlat

type=thisNode.SelectSingleNode("//RouteAddr[@type]")
val=thisNode.SelectSingleNode("//RouteAddr").InnerText

Open in new window

AlexPonnath

ASKER
This code seems to not work for doc with name space... it returns nothing
Experts Exchange is like having an extremely knowledgeable team sitting and waiting for your call. Couldn't do my job half as well as I do without it!
James Murphy
YZlat

What if you add namespaces?

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

Open in new window

AlexPonnath

ASKER
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
YZlat

What error are you getting and in what line?
⚡ FREE TRIAL OFFER
Try out a week of full access for free.
Find out why thousands trust the EE community with their toughest problems.
AlexPonnath

ASKER
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
YZlat

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
AlexPonnath

ASKER
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


call.png
Experts Exchange has (a) saved my job multiple times, (b) saved me hours, days, and even weeks of work, and often (c) makes me look like a superhero! This place is MAGIC!
Walt Forbes
YZlat

I tire dit on a sample file you have sent me. This looks very different
AlexPonnath

ASKER
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
YZlat

change it to:

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

Open in new window

⚡ FREE TRIAL OFFER
Try out a week of full access for free.
Find out why thousands trust the EE community with their toughest problems.
AlexPonnath

ASKER
Still nothing, both return blank
SOLUTION
YZlat

THIS SOLUTION ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
See Pricing Options
Start Free Trial
GET A PERSONALIZED SOLUTION
Ask your own question & get feedback from real experts
Find out why thousands trust the EE community with their toughest problems.
AlexPonnath

ASKER
Wow, finaly we figured out this beast..
It returns now the correct value for Type
Thanks