Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 109
  • Last Modified:

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

0
AlexPonnath
Asked:
AlexPonnath
  • 8
  • 8
2 Solutions
 
YZlatCommented:
to get all children nodes use recursive. The code below will retrieve InnerText of all the nodes:

Sub GetAllChildNodes(ByVal parentNode As XmlNode)
        For Each childNode As XmlNode In parentNode.ChildNodes
            Console.Write(childNode.InnerText)
            GetAllChildNodes(childNode)
        Next
    End Sub

Open in new window


to check for particular node, you can use XPath

m_node= m_xmld.SelectSingleNode("//OrigParty/SubscriberAddr[@type]")

Open in new window


as well as to retrieve particular node:

m_nodelist= m_xmld.SelectNodes("//OrigParty/SubscriberAddr").InnerText

Open in new window

1
 
AlexPonnathAuthor Commented:
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>
0
 
YZlatCommented:
type=thisNode.SelectSingleNode("//RouteAddr[@type]")
val=thisNode.SelectSingleNode("//RouteAddr").InnerText

Open in new window

0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

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

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

Open in new window

0
 
AlexPonnathAuthor Commented:
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
0
 
YZlatCommented:
What error are you getting and in what line?
0
 
AlexPonnathAuthor Commented:
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
0
 
YZlatCommented:
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
0
 
AlexPonnathAuthor Commented:
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
0
 
YZlatCommented:
I tire dit on a sample file you have sent me. This looks very different
0
 
AlexPonnathAuthor Commented:
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
0
 
YZlatCommented:
change it to:

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

Open in new window

0
 
AlexPonnathAuthor Commented:
Still nothing, both return blank
0
 
YZlatCommented:
thisNode.SelectSingleNode("//ns:RoutedAddr", nsmgr).Attributes("type").Value

Open in new window

0
 
AlexPonnathAuthor Commented:
Wow, finaly we figured out this beast..
It returns now the correct value for Type
Thanks
0

Featured Post

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

  • 8
  • 8
Tackle projects and never again get stuck behind a technical roadblock.
Join Now