Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Complex string parsing
Message
 
 
To
All
General information
Forum:
ASP.NET
Category:
Coding, syntax and commands
Title:
Complex string parsing
Environment versions
Environment:
C# 4.0
OS:
Windows 7
Network:
Windows 2003 Server
Database:
MS SQL Server
Miscellaneous
Thread ID:
01568786
Message ID:
01568786
Views:
68
Hi everybody,

This is my colleague's code:
Regex regexXml = new Regex(@"\<(?'field'[^/].*?)\>(?'data'.*?)\</\k'field'\>");

         MatchCollection matches = regexXml.Matches(tcSQML);
What we want is to parse a string like this
String input = "<func>GetResLog</func><tcOperator>ADMIN</tcOperator><tcSalespoint>TICKETS</tcSalespoint><tnReservNo>1001001</tnReservNo><tcReturnType>DSP</tcReturnType>";
into a dictionary of String, String where key represents the parameter's name and the value represents the value.

The string above is simple and works nice with that RegEx expression.

The problem is that we may have some nested XML like strings inside the parameters or even some chunks of XML (not necessary valid).

So, the above doesn't work for the string like this
String input = @"<func>getqtyremaining</func><tcoperator>ADMIN</tcoperator><tcreturntype>XML</tcreturntype>
<tcsalespoint>TICKET004001</tcsalespoint><ttdatetime>03/11/2013 01:19 PM</ttdatetime>
<TCDCILIST><DCI>ACTIVITIESSKYDIVING 1000      </DCI><DCI>ACTIVITIESSKYDIVING 1030      </DCI>
<DCI>ACTIVITIESSKYDIVING 1100      </DCI><DCI>ACTIVITIESSKYDIVING 1130      </DCI><DCI>ACTIVITIESSKYDIVING 1200      </DCI>
<DCI>ACTIVITIESSKYDIVING 1230      </DCI><DCI>ACTIVITIESSKYDIVING 1300      </DCI><DCI>ACTIVITIESSKYDIVING 1330      </DCI>
<DCI>ACTIVITIESSKYDIVING 1400      </DCI><DCI>ACTIVITIESSKYDIVING 1430      </DCI></TCDCILIST>";
The whole current method is this
public static void PopulateFromSQML(this Dictionary<String, String> tDictionary, String tcSQML)
      {
         Regex regexXml = new Regex(@"\<(?'field'[^/].*?)\>(?'data'.*?)\</\k'field'\>");

         MatchCollection matches = regexXml.Matches(tcSQML);
         foreach (Match m in matches)
         {
            try
            {
               if (!tDictionary.ContainsKey(m.Groups["field"].ToString()))
                  tDictionary.Add(m.Groups["field"].ToString(), m.Groups["data"].ToString());
            }
            catch (Exception)
            {
               // Don't care
            }
         }
      }
Do you see what can I change in that method to be able to properly handle such strings?
If it's not broken, fix it until it is.


My Blog
Next
Reply
Map
View

Click here to load this message in the networking platform