当前位置: 首页 > 工具软件 > XMLDictionary > 使用案例 >

XML多层复杂结构转Dictionary<String,Object>类型

苏硕
2023-12-01

    *XML多层复杂结构转Dictionary<String,Object>类型

将XML字符串转换为泛型Dictionary

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Web.Script.Serialization;
using System.Collections;


namespace XMLhead
{
    class XMLConvert
    {
        /**
         * XML多层复杂结构转Dictionary<String,Object>类型
         * 
         * 将XML字符串转换为泛型
         * 
         */


        public static Dictionary<String,Object> ReadXMLToDictionary(String XmlStr)
        {
            XmlDocument _XmlDoc = new XmlDocument();
            _XmlDoc.LoadXml(XmlStr);


            Dictionary<String, Object> XmlObject = new Dictionary<String, Object>();
            if (_XmlDoc.DocumentElement.ChildNodes.Count <= 0) {
                throw new Exception("XML节点错误{节点值为0}!");            
            }


            if (XmlNodeRepeat(_XmlDoc.DocumentElement.ChildNodes))
            {
                XmlObject.Add(_XmlDoc.DocumentElement.Name, XMLList(_XmlDoc.DocumentElement.ChildNodes));
            }
            else
            {
                foreach (XmlNode TempObject in _XmlDoc.DocumentElement.ChildNodes)
                {
                    if (TempObject.ChildNodes.Count>1)
                    {
                        if (XmlNodeRepeat(TempObject.ChildNodes))
                        {
                            XmlObject.Add(TempObject.Name, XMLList(TempObject.ChildNodes));
                        }
                        else
                        {
                            XmlObject.Add(TempObject.Name, ObjectToDictionary(TempObject.ChildNodes));
                        }
                    }
                    else
                    {
                        XmlObject.Add(TempObject.Name, TempObject.InnerText);
                    }
                }
            }


            return XmlObject;
        }


        /**
         * 
         * 例表处理
         * 
         */ 
        private static ArrayList XMLList(XmlNodeList NodeObjects)
        {
                ArrayList XmlDictionary = new ArrayList();
                foreach (XmlNode TempObject in NodeObjects)
                {
                    Dictionary<String, Object> XmlListObject = new Dictionary<String, Object>();
                    XmlListObject.Add(TempObject.Name, ObjectToDictionary(TempObject.ChildNodes));
                    XmlDictionary.Add(XmlListObject);
                }
                return XmlDictionary;
        }


        /**
         * 
         * 
         * 单节点处理
         * 
         */ 
        private static Dictionary<String, Object> ObjectToDictionary(XmlNodeList NodeObjects) {


                Dictionary<String, Object> XmlObject = new Dictionary<String, Object>();
                foreach (XmlNode TempObject in NodeObjects)
                {
                    if (TempObject.ChildNodes.Count > 1)
                    {
                        if (XmlNodeRepeat(TempObject.ChildNodes))
                        {
                            XmlObject.Add(TempObject.Name, XMLList(TempObject.ChildNodes));
                        }
                        else
                        {
                            XmlObject.Add(TempObject.Name, ObjectToDictionary(TempObject.ChildNodes));
                        }
                    }
                    else {
                        XmlObject.Add(TempObject.Name, TempObject.InnerText);                    
                    }
                }
                return XmlObject;        
        }


        /**
         * 
         * 节点重复检测
         * 
         * 
         */ 
        private static Boolean XmlNodeRepeat(XmlNodeList ChildNodeObjects)
        {


            if (ChildNodeObjects.Count ==1 || ChildNodeObjects.Count == 0)
            {
                return false;
            }


            Dictionary<String, Int32> TempDictionary = new Dictionary<String, Int32>();
            foreach (XmlNode TempNode in ChildNodeObjects) {                    
                    if(!TempDictionary.ContainsKey(TempNode.Name.ToString())){
                        TempDictionary.Add(TempNode.Name.ToString(),0);
                    }else if(TempDictionary.ContainsKey(TempNode.Name.ToString())){
                        TempDictionary[TempNode.Name.ToString()]++;
                    }
                }


            if (ChildNodeObjects.Count == TempDictionary.Count)
            {
                return false;
            }
            else if (TempDictionary.Count == 1 && ChildNodeObjects.Count >1)
            {
                return true;
            }
            throw new Exception("XmlNode节点为无规则例表!");
        }


    }

}


 类似资料: