zoukankan      html  css  js  c++  java
  • XmlToJson

    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();
            }
        }
    }
    


  • 相关阅读:
    跟我一起来学ORACLE开发系列之三sql语法篇 老猫
    浅谈Oracle DBlink搭建 老猫
    一个合格的Oracle DBA的速成法摘录 老猫
    Oracle数据库设计要做到五戒 老猫
    Oracle分析函数参考手册一 老猫
    Oracle10G常用维护语句 老猫
    数据库设计中的敏捷方法 老猫
    oracle数据字典总结 老猫
    DBA 1.0与DBA眼中的DBA 2.0时代 老猫
    海水的绘制 szlongman
  • 原文地址:https://www.cnblogs.com/zhangqs008/p/2802232.html
Copyright © 2011-2022 走看看