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

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。