How to read repeating fields from Info Path request form
This custom method can be used to read a single field or repeating fields of a Info Path request form from a sharepoint workflow.
//xpathNode – The actual Xpath node value in the datasource of your info path form
//mutiplenodes – a bool variable that defines whether you are parsing a single node or trying to parse subsequent child nodes under the parent “xpathNode”
//childNode – repeating childnode xpath value under the parent “xpathNode” in the info path request form.
private string parseInfoPathRequestForm(string xpathNode, bool mutlipleNodes, string childNode)
{
SPFile requestForm = workflowProperties.Item.File;
byte[] requestFormData = requestForm.OpenBinary();
XPathDocument inForm = null;
string parseNode = xpathNode;
string parseNodeValue = string.Empty;
try
{
using (MemoryStream ms = new MemoryStream(requestFormData))
{
inForm = new XPathDocument(ms);
ms.Close();
}
XPathNavigator inFormNav = inForm.CreateNavigator();
inFormNav.MoveToFollowing(XPathNodeType.Element);
XmlNamespaceManager nsManager = new XmlNamespaceManager(new NameTable());
foreach (KeyValuePair<string, string> ns in inFormNav.GetNamespacesInScope(XmlNamespaceScope.All))
{
if (ns.Key == String.Empty)
{
nsManager.AddNamespace(“def”, ns.Value);
}
else
{
nsManager.AddNamespace(ns.Key, ns.Value);
}
}
if (!mutlipleNodes)
{
XPathNavigator nodeNav = inFormNav.SelectSingleNode(parseNode, nsManager);
if (nodeNav != null)
parseNodeValue = nodeNav.Value;
}
else if (mutlipleNodes)
{
XPathNodeIterator reviewers = inFormNav.Select(parseNode, nsManager);
foreach (XPathNavigator person in reviewers)
{
parseNodeValue = parseNodeValue + “;” + person.SelectSingleNode(childNode, nsManager).Value;
}
}
}
catch (Exception ex)
{
//Write the Exception to the Portal Log.
}
return (parseNodeValue);
}
Usage :
//Repeating section-
_RequestReviewers = parseInfoPathRequestForm(“//my:ptFields//my:authorDetails//my:pickReviewers”, true, “my:reviewerSelector//my:contactSelector//my:Person//my:AccountId”); < Here pickReviewers is a repeating section with a contact selector (reviewerSelector) placed in that.>
//Single field –
_PublicationType = parseInfoPathRequestForm(“//my:ptFields//my:authorDetails//my:publicationType”, false, “”);