[Webinar] Streamline your web hosting managementRegister Today

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

C#: using xpath to find matching node

I have the following method which loops through the <desc> node in an xml file to find if it matches the parameter "msg".
What I need to do is ,once found retrieve the <code> from the xml. How do I do that?

        static string getCode(string msg)
        {
            string filename = @"C:\temp\errors.xml";
            string xmlCode="";

            XmlDocument doc = new XmlDocument();
            doc.Load(filename);
            XmlNodeList nodes = doc.SelectNodes("/edt/ce/desc");

            foreach (XmlNode node in nodes)
            {
                if (node.InnerText.Trim().Equals(msg))
                    xmlCode = "Found";  //should be the <code> associated to the matching <desc>
                else
                    xmlCode = "Not found";

            }

            msg = xmlCode;

            return msg;
        }
            
            
This is errors.xml
<edt name="errors">
      <ce>
            <code>1111</code>
            <desc>Not here</desc>
      </ce>
      <ce>
            <code>2222</code>
            <desc>Invalid Input </desc>
      </ce>
</edt>
0
badtz7229
Asked:
badtz7229
  • 3
  • 2
2 Solutions
 
deepu chandranCommented:
Hi,
Please try LINQ to SQL, Below code will work

IEnumerable<XElement> xmlDocuments = from x in XElement.Load(@"d:\deepu\sample.xml").Elements("ce")
                                             select x;

        var elements = from c in xmlDocuments
                       where
                           c.Element("desc").Value.Contains("Not")
                       select c;

Open in new window


Thanks
Deepu
0
 
Carl TawnSystems and Integration DeveloperCommented:
You can achieve what you want in one step, rather than resorting to a loop:
XmlNode node = doc.SelectSingleNode("/edt/ce[desc='" + msg + "']/code");
if (node != null)
{   
      // found the correct node

     string code = node.InnerText;
}

Open in new window

0
 
badtz7229Author Commented:
@carl
How do I trim <desc> before inserting he parameter? Bc sometimes there's a trailing spaces in the XML file and the match won't be found
0
The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

 
Carl TawnSystems and Integration DeveloperCommented:
The normalize-space XPath function will trim whitespace from the start and end of the string:
XmlNode node = doc.SelectSingleNode("/edt/ce[normalize-space(desc)='" + msg + "']/code");

Open in new window

0
 
badtz7229Author Commented:
thank you, this worked successfully.
0
 
badtz7229Author Commented:
@carl
how do i use your solution in the event that the msg parameter contains an apostrophe?
(i.e. - Can't create Server object). This string exists in the xml
0

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

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