首页 > 代码库 > xml转datatable和json

xml转datatable和json

xml字符串转为DataTable与Json

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Xml;using System.Text;using System.Collections;using System.Data;/// <summary>///XmlHelper 的摘要说明/// </summary>public class XmlHelper{    public static string XmlToJSON(XmlDocument xmlDoc)    {        StringBuilder sbJSON = new StringBuilder();        sbJSON.Append("{ ");        XmlToJSONnode(sbJSON, xmlDoc.DocumentElement, true);        sbJSON.Append("}");        return sbJSON.ToString();    }    public static DataTable XmlToDataTable(XmlDocument xmlDoc,string xmlPath)    {        XmlNodeList xlist = xmlDoc.SelectNodes(xmlPath);        DataTable dt = new DataTable();        DataRow dr;        for (int i = 0; i < xlist.Count; i++)        {            dr = dt.NewRow();            XmlElement xe = (XmlElement)xlist.Item(i);            for (int j = 0; j < xe.Attributes.Count; j++)            {                if (!dt.Columns.Contains("@" + xe.Attributes[j].Name))                    dt.Columns.Add("@" + xe.Attributes[j].Name);                dr["@" + xe.Attributes[j].Name] = xe.Attributes[j].Value;            }            for (int j = 0; j < xe.ChildNodes.Count; j++)            {                if (!dt.Columns.Contains(xe.ChildNodes.Item(j).Name))                    dt.Columns.Add(xe.ChildNodes.Item(j).Name);                dr[xe.ChildNodes.Item(j).Name] = xe.ChildNodes.Item(j).InnerText;            }            dt.Rows.Add(dr);        }        return dt;    }    private static void XmlToJSONnode(StringBuilder sbJSON, XmlElement node, bool showNodeName)    {        if (showNodeName)            sbJSON.Append("\"" + SafeJSON(node.Name) + "\": ");        sbJSON.Append("{");        SortedList childNodeNames = new SortedList();        if (node.Attributes != null)            foreach (XmlAttribute attr in node.Attributes)                StoreChildNode(childNodeNames, attr.Name, attr.InnerText);        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);        }        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(" }");    }    private static void StoreChildNode(SortedList childNodeNames, string nodeName, object nodeValue)    {        if (nodeValue is XmlElement)        {            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;            }        }        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(", ");    }    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();    }}

 

xml转datatable和json