public static OpenSearchParameterValueSet FromOpenSearchDescription(string template, OpenSearchDescriptionUrlParameter[] origParams = null, XmlSerializerNamespaces namespaces = null)
{
OpenSearchParameterValueSet result = new OpenSearchParameterValueSet();
Dictionary<string, OpenSearchDescriptionUrlParameter> tempParameters = new Dictionary<string, OpenSearchDescriptionUrlParameter>();
Dictionary<string, string> tempNamespaces = null;
if (origParams != null) {
foreach (OpenSearchDescriptionUrlParameter origParam in origParams) tempParameters.Add(origParam.Name, origParam);
}
if (namespaces != null) {
result.nameTable = new NameTable();
tempNamespaces = new Dictionary<string, string>();
foreach (XmlQualifiedName qn in namespaces.ToArray()) {
tempNamespaces.Add(qn.Name, result.nameTable.Add(qn.Namespace));
}
}
// Make sure URL is valid
Match match = urlRegex.Match(template);
if (!match.Success) throw new OpenSearchException(String.Format("Invalid URL template: {0}", template));
// Split by query string parameter and add parameter definitions to the internal dictionaries:
// parameters can be settable (e.g. name={key}, name={prefix:key}) or fixed (name=value)
string[] items = match.Groups[1].Value.Split('&');
foreach (string item in items) {
Match match2 = parameterDefinitionRegex.Match(item);
if (!match2.Success) continue;
string name = match2.Groups[1].Value;
OpenSearchParameterDefinition paramDef;
if (match2.Groups[3].Success) { // parameter is settable
string identifier = match2.Groups[3].Value;
string identifierNamespaceUri = null, identifierLocalName = null;
if (tempNamespaces != null) {
string[] parts = identifier.Split(':');
if (parts.Length == 2) {
identifierNamespaceUri = tempNamespaces.ContainsKey(parts[0]) ? tempNamespaces[parts[0]] : null;
if (identifierNamespaceUri != null) identifierLocalName = parts[1];
}
}
paramDef = new OpenSearchParameterDefinition(name, identifier, identifierNamespaceUri, identifierLocalName, tempParameters.ContainsKey(name) ? tempParameters[name] : null);
result.parametersByIdentifier[identifier] = paramDef;
} else { // parameter is fixed
paramDef = new OpenSearchParameterDefinition(name);
result.values[paramDef] = new string[] {match2.Groups[2].Value};
}
result.parametersByName[paramDef.Name] = paramDef;
}
return result;
}