• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 344
  • Last Modified:

Issue in parsing xml using C#

Hi all,
I am facing some problem in getting the attribute values from a xml file using C#. I have attached the code snippet.

My program accepts an input structure from an xml file (see attachment). It parses the file and then gets all the column names that is in turn used to create columns in Grid view control. The issue is... I am not able to get the column names if the node has some sub nodes.

In the attached xml file, you can see the <member Name"elemDesc" type="unsigned int"> has one or more sub nodes <Value></Value>. In this case the column names are not getting displayed.
But works fine if the node does not have any sub nodes as in <member Name = "Type" type = "unsigned int" />

I am sure the problem lies in the expression passed. Please help me resolve this issue. without this I will not be able to proceed with my work comfortable :(

private void ReadInputStructure(ref List<string> Items, string deviceName)
        {            
            try
            {   
                string fileName = "D:\\Ultrasound\\Initiatives\\StructureInput.xml";
                XPathDocument doc = new XPathDocument(fileName);
                XPathNavigator nav = doc.CreateNavigator();
 
                // Compile a standard XPath expression
                XPathExpression expr;
                expr = nav.Compile("/devices/device[@Name=\"" + deviceName + "\"]/member");
                XPathNodeIterator iterator = nav.Select(expr);                
                while (iterator.MoveNext())
				{
					XPathNavigator nav2 = iterator.Current.Clone();                    
					nav2.MoveToFirstChild();
                    string ColumnName = nav2.GetAttribute("Name", nav2.NamespaceURI);                    
                    Items.Add(ColumnName);  
				}                
			}
			catch(Exception ex) 
			{
				Console.WriteLine(ex.Message);
			}            
        }

Open in new window

StructureInput.txt
0
yamurthy
Asked:
yamurthy
  • 2
2 Solutions
 
abelCommented:
It seems that all you are interested in is the Name attribute, correct? Why not change your XPath to only select the name attributes, like this?:

expr = nav.Compile("/devices/device[@Name=\"" + deviceName + "\"]/member/@Name");
0
 
openshacCommented:
Can you give the output you are after, I'm a little unsure of what you want.

I don't know if the following will work:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(fileName);
 
foreach(XmlNode node in xmlDoc.SelectNodes("/devices/device[@Name=\"" + deviceName + "\"]/member"))
{
    Items.Add(node.Attributes["Name"].Value);
}

Open in new window

0
 
yamurthyAuthor Commented:
I finally used openshac's solution. this worked fine and reduced my code size and simplified code reading!!! :) Thanks for your replies
0
 
abelCommented:
You're welcome :)
0

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

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