Parsing multi-value fields - MultiChoice, Lookup, User, URL. Rules for the ";#" delimiter.
For certain types of columns (aka fields), SharePoint stores several values in one field, using a delimiter to separate the different values.
Column Type |
Items |
Delimiter |
Example |
Choices , configured as Display choices using Checkboxes (allow multiple selections ) |
All selected choices |
;# |
;#First;#Second;#Third;# |
Lookup |
Item index, lookup value |
;# |
1;#First |
Person or Group |
Item index, user value |
;# |
42;#Mark Arend |
Hyperlink or Picture |
URL, text link |
, |
https://microsoft.com, Microsoft |
Whenever parsing’s involved, I like to use regular expressions, even if I’m just extracting a single substring. This way, I can maintain all my parsing instructions in one place, making it easy to fix problems like missing a boundary case in my original understanding of the parse.
Below are three regular expressions that parse the above column types. I usually make these static members of a class named Util, so I can call them easily throughout my code. The code samples include commented examples of using each regular expression.
/// <summary>
/// Regular expression to isolate multi-choice values
/// </summary>
/// <example>
// System.Text.RegularExpressions.Match choice;
// string strField;
// foreach (SPListItem item in list.Items)
// {
// strField = (string)item["MultiChoiceField"];
// output.Append(item.Title + ": " + strField + "<BR>");
// if (strField != null)
// {
// choice = Util.rexMultiChoiceField.Match(strField);
// while (choice.Success)
// {
// output.Append("- " + choice.Result("$1") + "<BR>");
// choice = choice.NextMatch();
// }
// }
// }
///// </example>
internal static System.Text.RegularExpressions.Regex rexMultiChoiceField =
new System.Text.RegularExpressions.Regex(@"#(.+?);",
System.Text.RegularExpressions.RegexOptions.Compiled);
/// <summary>
/// Regular expression to isolate an ID ("$1") or lookup value ("$2")
/// Use this for "Lookup" fields, or for "Person or Group" fields
/// </summary>
/// <example>
/// string LookupField, LookupId, LookupValue;
/// if (Util.rexLookupField.Match(LookupField).Success)
/// {
/// LookupId = Util.rexLookupField.Match(LookupField).Result("$1");
/// LookupValue = Util.rexLookupField.Match(LookupField).Result("$2");
/// }
/// </example>
internal static System.Text.RegularExpressions.Regex rexLookupField =
new System.Text.RegularExpressions.Regex(@"(\d+);#(.*)$",
System.Text.RegularExpressions.RegexOptions.Compiled);
/// <summary>
/// Regular expression to isolate a URL ("$1") or its Description ("$2")
/// </summary>
/// <example>
/// string UrlField, UrlPath, UrlName;
/// if (Util.rexUrlField.Match(UrlField).Success)
/// {
/// UrlPath = Util.rexUrlField.Match(UrlField).Result("$1");
/// UrlName = Util.rexUrlField.Match(UrlField).Result("$2");
/// }
/// </example>
internal static System.Text.RegularExpressions.Regex rexUrlField =
new System.Text.RegularExpressions.Regex(@"^(.*), +(.*)$",
System.Text.RegularExpressions.RegexOptions.Compiled);
See also the SPListItem Class discussion in the SDK for additional samples. If you know of better details regarding these delimited value fields, please post replies. Thanks!!
Comments
Anonymous
May 29, 2007
PingBack from http://www.virtual-generations.com/2007/05/30/sharepoint-link-love-05-30-2007/Anonymous
June 20, 2007
Thanks Mark, thats great! I worked out the hyperlink one by myself but its great to have those other ones documented!Anonymous
March 17, 2008
SPFieldLookupValueCollection to parse multi-valued Lookup fields...