Solved

C#: using xpath to find matching node

Posted on 2014-04-29
6
794 Views
Last Modified: 2016-02-18
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
Comment
Question by:badtz7229
  • 3
  • 2
6 Comments
 
LVL 8

Expert Comment

by:deepu chandran
ID: 40031281
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
 
LVL 52

Assisted Solution

by:Carl Tawn
Carl Tawn earned 500 total points
ID: 40031410
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
 

Author Comment

by:badtz7229
ID: 40031882
@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
What Should I Do With This Threat Intelligence?

Are you wondering if you actually need threat intelligence? The answer is yes. We explain the basics for creating useful threat intelligence.

 
LVL 52

Accepted Solution

by:
Carl Tawn earned 500 total points
ID: 40031900
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
 

Author Closing Comment

by:badtz7229
ID: 40032003
thank you, this worked successfully.
0
 

Author Comment

by:badtz7229
ID: 40032396
@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

IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

This article introduced a TextBox that supports transparent background.   Introduction TextBox is the most widely used control component in GUI design. Most GUI controls do not support transparent background and more or less do not have the…
The Client Need Led Us to RSS I recently had an investment company ask me how they might notify their constituents about their newsworthy publications.  Probably you would think "Facebook" or "Twitter" but this is an interesting client.  Their cons…
Excel styles will make formatting consistent and let you apply and change formatting faster. In this tutorial, you'll learn how to use Excel's built-in styles, how to modify styles, and how to create your own. You'll also learn how to use your custo…
Access reports are powerful and flexible. Learn how to create a query and then a grouped report using the wizard. Modify the report design after the wizard is done to make it look better. There will be another video to explain how to put the final p…

744 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

10 Experts available now in Live!

Get 1:1 Help Now