XmlToJson-xml对象转换为Json对象类

来源:互联网 发布:fedora13 yum源 编辑:程序博客网 时间:2024/06/05 21:58
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Xml;using System.Collections;namespace Framework{    /// <summary>    /// 将xml转换为json    /// </summary>    public class XmlToJson    {        /// <summary>        /// 将xml转换为json        /// </summary>        /// <param name="xmlFile">xml文件</param>        /// <returns></returns>        public static string XmlToJSON(string xmlFile)        {            XmlDocument doc = new XmlDocument();            doc.Load(xmlFile);            return XmlToJSON(doc);        }        /// <summary>        /// 将xml转换为json        /// </summary>        /// <param name="xmlDoc">xml文档</param>        /// <returns></returns>        public static string XmlToJSON(XmlDocument xmlDoc)        {            StringBuilder sbJSON = new StringBuilder();            sbJSON.Append("{ ");            XmlToJSONnode(sbJSON, xmlDoc.DocumentElement, true);            sbJSON.Append("}");            return sbJSON.ToString();        }        //  XmlToJSONnode:  Output an XmlElement, possibly as part of a higher array        private static void XmlToJSONnode(StringBuilder sbJSON, XmlElement node, bool showNodeName)        {            if (showNodeName)                sbJSON.Append("\"" + SafeJSON(node.Name) + "\": ");            sbJSON.Append("{");            // Build a sorted list of key-value pairs            //  where   key is case-sensitive nodeName            //          value is an ArrayList of string or XmlElement            //  so that we know whether the nodeName is an array or not.            SortedList childNodeNames = new SortedList();            //  Add in all node attributes            if (node.Attributes != null)                foreach (XmlAttribute attr in node.Attributes)                    StoreChildNode(childNodeNames, attr.Name, attr.InnerText);            //  Add in all nodes            foreach (XmlNode cnode in node.ChildNodes)            {                if (cnode is XmlText)                    StoreChildNode(childNodeNames, "value", cnode.InnerText);                else if (cnode is XmlElement)                    StoreChildNode(childNodeNames, cnode.Name, cnode);            }            // Now output all stored info            foreach (string childname in childNodeNames.Keys)            {                ArrayList alChild = (ArrayList)childNodeNames[childname];                if (alChild.Count == 1)                    OutputNode(childname, alChild[0], sbJSON, true);                else                {                    sbJSON.Append(" \"" + SafeJSON(childname) + "\": [ ");                    foreach (object Child in alChild)                        OutputNode(childname, Child, sbJSON, false);                    sbJSON.Remove(sbJSON.Length - 2, 2);                    sbJSON.Append(" ], ");                }            }            sbJSON.Remove(sbJSON.Length - 2, 2);            sbJSON.Append(" }");        }        //  StoreChildNode: Store data associated with each nodeName        //                  so that we know whether the nodeName is an array or not.        private static void StoreChildNode(SortedList childNodeNames, string nodeName, object nodeValue)        {            // Pre-process contraction of XmlElement-s            if (nodeValue is XmlElement)            {                // Convert  <aa></aa> into "aa":null                //          <aa>xx</aa> into "aa":"xx"                XmlNode cnode = (XmlNode)nodeValue;                if (cnode.Attributes.Count == 0)                {                    XmlNodeList children = cnode.ChildNodes;                    if (children.Count == 0)                        nodeValue = null;                    else if (children.Count == 1 && (children[0] is XmlText))                        nodeValue = ((XmlText)(children[0])).InnerText;                }            }            // Add nodeValue to ArrayList associated with each nodeName            // If nodeName doesn't exist then add it            object oValuesAL = childNodeNames[nodeName];            ArrayList ValuesAL;            if (oValuesAL == null)            {                ValuesAL = new ArrayList();                childNodeNames[nodeName] = ValuesAL;            }            else                ValuesAL = (ArrayList)oValuesAL;            ValuesAL.Add(nodeValue);        }        private static void OutputNode(string childname, object alChild, StringBuilder sbJSON, bool showNodeName)        {            if (alChild == null)            {                if (showNodeName)                    sbJSON.Append("\"" + SafeJSON(childname) + "\": ");                sbJSON.Append("null");            }            else if (alChild is string)            {                if (showNodeName)                    sbJSON.Append("\"" + SafeJSON(childname) + "\": ");                string sChild = (string)alChild;                sChild = sChild.Trim();                sbJSON.Append("\"" + SafeJSON(sChild) + "\"");            }            else                XmlToJSONnode(sbJSON, (XmlElement)alChild, showNodeName);            sbJSON.Append(", ");        }        // Make a string safe for JSON        private static string SafeJSON(string sIn)        {            StringBuilder sbOut = new StringBuilder(sIn.Length);            foreach (char ch in sIn)            {                if (Char.IsControl(ch) || ch == '\'')                {                    int ich = (int)ch;                    sbOut.Append(@"\u" + ich.ToString("x4"));                    continue;                }                else if (ch == '\"' || ch == '\\' || ch == '/')                {                    sbOut.Append('\\');                }                sbOut.Append(ch);            }            return sbOut.ToString();        }    }}

原创粉丝点击