C # XmlDocument SelectNodes not working

I want to get the value from an XML file, but I failed. Could you help me point out the problem? Because I already tried very hard to test and search on Google, but I still don't see the problem.

XML:

<?xml version="1.0" encoding="utf-8" ?> <Contacts> - <Contact> <ID>xxx</ID> <AutoUpdateEnabled>false</AutoUpdateEnabled> <LastChanged>2013-05-29T01:53:59.4470000Z</LastChanged> - <Profiles> - <Personal> <FirstName>My First Name</FirstName> <LastName>My Last Name</LastName> <UniqueName>My Unique Name</UniqueName> <SortName></SortName> <DisplayName>My Display Name</DisplayName> </Personal> </Profiles> - <Phones> - <Phone> <ID>3</ID> <PhoneType>Mobile</PhoneType> <Number>000-0000000</Number> <IsIMEnabled>false</IsIMEnabled> <IsDefault>false</IsDefault> </Phone> </Phones> - <Locations> - <Location> <ID>2</ID> <LocationType>Business</LocationType> <CompanyName></CompanyName> <IsDefault>false</IsDefault> </Location> </Locations> </Contact> - <Contact> <ID>xxx</ID> <AutoUpdateEnabled>false</AutoUpdateEnabled> <LastChanged>2013-05-29T01:53:25.2670000Z</LastChanged> - <Profiles> - <Personal> <FirstName>Person</FirstName> <LastName>Two</LastName> <UniqueName></UniqueName> <SortName></SortName> <DisplayName>Person Two</DisplayName> </Personal> </Profiles> - <Emails> - <Email> <ID>1</ID> <EmailType>Personal</EmailType> <Address> MyTest@gmail.com </Address> <IsIMEnabled>false</IsIMEnabled> <IsDefault>true</IsDefault> </Email> </Emails> - <Locations> - <Location> <ID>2</ID> <LocationType>Business</LocationType> <CompanyName>Testing Company</CompanyName> <IsDefault>false</IsDefault> </Location> </Locations> </Contact> </Contacts> 

My sample code is:

 XmlDocument xmldoc = new XmlDocument(); xmldoc.LoadXml("TheXMLFile.xml"); xmldoc.DocumentElement.SelectNodes("contact") // return 0 counts xmldoc.DocumentElement.SelectNodes("/contact") // return 0 counts xmldoc.DocumentElement.SelectNodes("/contact") // return 0 counts xmldoc.DocumentElement.SelectNodes("/contacts/contact") // return 0 counts xmldoc.DocumentElement.SelectNodes("*") // return 2 counts !this works XmlNodeList elemList = xmldoc.DocumentElement.GetElementsByTagName("contact"); // return 2 counts !this also works foreach (XmlNode node in elemList) { node.SelectSingleNode("Profiles") //return "" node.SelectSingleNode("/Profiles") //return "" node.SelectSingleNode("//Profiles") //return "" node.SelectSingleNode(".//Profiles") //return "" } 

I just want to get "FirstName, LastName, Email Address", the SelectNodes function just doesn't work as expected ... There is no hint at all ... please help. thanks in advance

+7
source share
2 answers

You need something like this:

 XmlDocument xmldoc = new XmlDocument(); xmldoc.Load(@"D:\temp\contacts.xml"); // use the .Load() method - not .LoadXml() !! // get a list of all <Contact> nodes XmlNodeList listOfContacts = xmldoc.SelectNodes("/Contacts/Contact"); // iterate over the <Contact> nodes foreach (XmlNode singleContact in listOfContacts) { // get the Profiles/Personal subnode XmlNode personalNode = singleContact.SelectSingleNode("Profiles/Personal"); // get the values from the <Personal> node if (personalNode != null) { string firstName = personalNode.SelectSingleNode("FirstName").InnerText; string lastName = personalNode.SelectSingleNode("LastName").InnerText; } // get the <Email> nodes XmlNodeList emailNodes = singleContact.SelectNodes("Emails/Email"); foreach (XmlNode emailNode in emailNodes) { string emailTyp = emailNode.SelectSingleNode("EmailType").InnerText; string emailAddress = emailNode.SelectSingleNode("Address").InnerText; } } 

With this approach, you should be able to read all the necessary data.

+10
source

XML tags are case-specific, so contact! = Contact.

Change this to begin.

0
source

All Articles