123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Xml;
- namespace Ant.Service.Common
- {
- /// <summary>
- /// 将xml转换为json
- /// </summary>
- public class XmlToJson
- {
- public static string XmlStrToJSON(string xmlStr)
- {
- XmlDocument doc = new XmlDocument();
- doc.LoadXml(xmlStr);
- return XmlToJSON(doc);
- }
- /// <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();
- }
- }
- }
|