Пример #1
0
        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);
        }