How to convert XML to JSON in ASP.NET C#

原文:http://www.phdcc.com/xml2json.htm

using System;
using System.Collections;
using System.Globalization;
using System.Text;
using System.Xml;
/// <summary>
    /// Some of this code was initially published on http://www.phdcc.com/xml2json.htm - thanks for your hard work!
    /// </summary>
    public class XmlToJSONParser
    {
        /// <summary>
        /// XMLs to JSON.
        /// </summary>
        /// <param name="xmlDoc">The XML doc.</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();
        }

        /// <summary>
        /// XmlToJSONnode:  Output an XmlElement,possibly as part of a higher array
        /// </summary>
        /// <param name="sbJSON">The sb JSON.</param>
        /// <param name="node">The node.</param>
        /// <param name="showNodeName">if set to <c>true</c> [show node name].</param>
        private static void XmlToJSONnode(StringBuilder sbJSON,XmlNode node,bool showNodeName)
        {
            if(showNodeName)
                sbJSON.Append(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(childname + ": [ ");
                    foreach(object Child in alChild)
                        OutputNode(childname,Child,false);
                    sbJSON.Remove(sbJSON.Length - 2,2);
                    sbJSON.Append(" ],");
                }
            }
            sbJSON.Remove(sbJSON.Length - 2,2);
            sbJSON.Append(" }");
        }

        /// <summary>
        /// StoreChildNode: Store data associated with each nodeName
        /// so that we know whether the nodeName is an array or not.
        /// </summary>
        /// <param name="childNodeNames">The child node names.</param>
        /// <param name="nodeName">Name of the node.</param>
        /// <param name="nodeValue">The node value.</param>
        private static void StoreChildNode(IDictionary 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 = ((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);
        }

        /// <summary>
        /// Outputs the node.
        /// </summary>
        /// <param name="childname">The childname.</param>
        /// <param name="alChild">The al child.</param>
        /// <param name="sbJSON">The sb JSON.</param>
        /// <param name="showNodeName">if set to <c>true</c> [show node name].</param>
        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(",");
        }

        /// <summary>
        /// make the json string safe for delivery across the wire
        /// </summary>
        /// <param name="s">The s.</param>
        /// <returns></returns>
        public static string SafeJSON(string s)
        {
            if(String.IsNullOrEmpty(s))
                return "\"\"";
            int i;
            int len = s.Length;
            StringBuilder sb = new StringBuilder(len + 4);
            string t;

            sb.Append('"');
            for(i = 0; i < len; i += 1)
            {
                char c = s[i];
                if((c == '\\') || (c == '"') || (c == '>'))
                {
                    sb.Append('\\');
                    sb.Append(c);
                }
                else if(c == '\b')
                    sb.Append("\\b");
                else if(c == '\t')
                    sb.Append("\\t");
                else if(c == '\n')
                    sb.Append("\\n");
                else if(c == '\f')
                    sb.Append("\\f");
                else if(c == '\r')
                    sb.Append("\\r");
                else
                {
                    if(c < ' ')
                    {
                        //t = "000" + Integer.toHexString(c);
                        string tmp = new string(c,1);
                        t = "000" + int.Parse(tmp,NumberStyles.HexNumber);
                        sb.Append("\\u" + t.Substring(t.Length - 4));
                    }
                    else
                        sb.Append(c);
                }
            }
            sb.Append('"');
            return sb.ToString();
        }
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇