AlexPonnath
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</ Subscriber Addr>
</OrigParty>
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</
</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
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
type=thisNode.SelectSingleNode("//RouteAddr[@type]")
val=thisNode.SelectSingleNode("//RouteAddr").InnerText
ASKER
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
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
sample2.xml
What error are you getting and in what line?
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
I know what the issue is. Replace the following lines:
with
You just used incorrect namespace
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)
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)
You just used incorrect namespace
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</RequestedAdd r><DestAdd r type=""e164"" xmlns=""http://www.metaswitch.com/cfs/billing/V1.0"">+12095551212</D estAddr><R outedAddr type=""national"" xmlns=""http://www.metaswitch.com/cfs/billing/V1.0"">2095551212</Rou tedAddr><C allingPart yRoutedAdd r type=""national"" xmlns=""http://www.metaswitch.com/cfs/billing/V1.0"">2095551212</Cal lingPartyR outedAddr> <CallingPa rtyOrigAdd r type=""national"" xmlns=""http://www.metaswitch.com/cfs/billing/V1.0"">2095551212</Cal lingPartyO rigAddr>"
OuterXml
<RoutingInfo xmlns=""http://www.metaswitch.com/cfs/billing/V1.0""><RequestedAddr type=""unknown"">12095551212</Reques tedAddr><D estAddr type=""e164"">+12095551212 </DestAddr ><RoutedAd dr type=""national"">20955512 12</Routed Addr><Call ingPartyRo utedAddr type=""national"">20955512 12</Callin gPartyRout edAddr><Ca llingParty OrigAddr type=""national"">20955512 12</Callin gPartyOrig Addr></Rou tingInfo>" String
I tire dit on a sample file you have sent me. This looks very different
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:Route dAddr", nsmgr).InnerText" but the "thisNode.SelectSingleNode ("ns:Route dAddr[@typ e]", 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
ASKER
Still nothing, both return blank
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Wow, finaly we figured out this beast..
It returns now the correct value for Type
Thanks
It returns now the correct value for Type
Thanks
ASKER
Open in new window
The node looks like thisOpen in new window
How can i get the Attribute (Type) and Value for <RoutedAddr>