user505210
user505210

Reputation: 1402

Doing regex style compare while looping through a XML file in C#

I have a XML file that i am using to loop through an on matching of a child node getting the value of a an attribute.The thing is matching these values with a * character or ? character like some regex style..can someone tell me how to do this .So if a request comes like g.portal.com it should match the second node .I am using .net 2.0

Below is my XML file

<Test>
   <Test Text="portal.com" Sample="1" />
   <Test Text="*.portal.com" Sample="201309" />
   <Test Text="portal-0?.com" Sample="201309" />       
</Test>



XmlDocument xDoc = new XmlDocument();
  xDoc.Load(PathToXMLFile);
 foreach (XmlNode node in xDoc.DocumentElement.ChildNodes)
                         {

                             if (node.Attributes["Sample"].InnerText == value)
                             {

                             }

                         }

Upvotes: 0

Views: 217

Answers (2)

Ovidiu
Ovidiu

Reputation: 1407

What you need to do is first convert each Text attribute into a valid Regex pattern and then use it to match your input. Something like this:

string input = "g.portal.com";
XmlNode foundNode = null;
foreach (XmlNode node in xDoc.DocumentElement.ChildNodes)
{
    string value = node.Attributes["Text"].Value;
    string pattern = Regex.Escape(value)
        .Replace(@"\*", ".*")
        .Replace(@"\?", ".");
    if (Regex.IsMatch(input, "^" + pattern + "$"))
    {
        foundNode = node;
        break;  //remove if you want to continue searching
    }
}

After executing the above code, foundNode should contain the second node from the xml file.

Upvotes: 1

Jonas B&#246;tel
Jonas B&#246;tel

Reputation: 4482

So you have an XML file that sets up patterns, right? You'll want to feed those patterns into Regexes and then stream a number of requests through them. Did I get that correct?

Assuming the XML file doesn't change it only needs to be processed into according Regexes. For example *.portal.com would translate to

new Regex("\\w+\\.portal\\.com");

You'll just have to escape the dots, replace * with \\w+ and ? with \\w if i guessed the semantics of you match patterns correctly.

Look up the correct replacements at http://msdn.microsoft.com/en-us/library/az24scfc(v=vs.110).aspx

Upvotes: 0

Related Questions