public object ParseHashtable(XmlNode node, ParseStack parseStack) { var retObj = new XmlRpcStruct(); parseStack.Push("class mapped to XmlRpcStruct"); try { var members = node.SelectChildNodes("member"); foreach (var member in members) { var(nameNode, hasMultipleNameNodes) = member.SelectPossibleDoupletteNode("name"); var(valueNode, hasMultipleValueNodes) = member.SelectPossibleDoupletteNode("value"); if (nameNode == null || nameNode.FirstChild == null) { throw new XmlRpcInvalidXmlRpcException(parseStack.ParseType + " contains a member with missing name" + " " + parseStack.Dump()); } if (hasMultipleNameNodes) { throw new XmlRpcInvalidXmlRpcException(parseStack.ParseType + " contains member with more than one name element" + " " + parseStack.Dump()); } var rpcName = nameNode.FirstChild.Value; if (valueNode == null) { throw new XmlRpcInvalidXmlRpcException(parseStack.ParseType + " contains class member " + rpcName + " with missing value " + " " + parseStack.Dump()); } if (hasMultipleValueNodes) { throw new XmlRpcInvalidXmlRpcException(parseStack.ParseType + " contains member with more than one value element" + " " + parseStack.Dump()); } if (retObj.Contains(rpcName)) { if (_config.IgnoreDuplicateMembers()) { continue; } throw new XmlRpcInvalidXmlRpcException(parseStack.ParseType + " contains class value with duplicate member " + nameNode.FirstChild.Value + " " + parseStack.Dump()); } parseStack.Push($"member {rpcName}"); try { var vvNode = valueNode.SelectValueNode(); var valObj = ParseValue(vvNode, null, parseStack); retObj.Add(rpcName, valObj); } finally { parseStack.Pop(); } } } finally { parseStack.Pop(); } return(retObj); }