Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Complex string parsing
Message
 
 
À
Tous
Information générale
Forum:
ASP.NET
Catégorie:
Code, syntaxe and commandes
Titre:
Complex string parsing
Versions des environnements
Environment:
C# 4.0
OS:
Windows 7
Network:
Windows 2003 Server
Database:
MS SQL Server
Divers
Thread ID:
01568786
Message ID:
01568786
Vues:
67
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
Suivant
Répondre
Fil
Voir

Click here to load this message in the networking platform