ASP.NET中XML转JSON的方法实例

所属分类: 网络编程 / ASP.NET 阅读数: 471
收藏 0 赞 0 分享

本文实例讲述了ASP.NET中XML转JSON的方法,分享给大家供大家参考。具体如下:

一般在许多应用程序中都将数据存储为XML的格式,而且会将数据以JSON的格式发送到客户端以做进一步处理。要实现这一点,它们必须将XML格式转换为JSON格式。

XML转JSON代码如下:

复制代码 代码如下:
private 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(); 
}

希望本文所述对大家的asp.net程序设计有所帮助。

更多精彩内容其他人还在看

.NET Core源码解析配置文件及依赖注入

这篇文章我们设计了一些复杂的概念,因为要对ASP.NET Core的启动及运行原理、配置文件的加载过程进行分析,依赖注入,控制反转等概念的讲解等
收藏 0 赞 0 分享

.NET Corek中Git的常用命令及实战演练

这篇文章将通过故事的形式从Git的历史谈起,并讲述Git的强大之处。然后通过实战演练教你如何在Github以及码云上托管我们的代码并进行代码的版本控制
收藏 0 赞 0 分享

Asp.Net Core WebAPI使用Swagger时API隐藏和分组详解

这篇文章主要给大家介绍了关于Asp.Net Core WebAPI使用Swagger时API隐藏和分组的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Asp.Net Core具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
收藏 0 赞 0 分享

如何利用FluentMigrator实现数据库迁移

这篇文章主要给大家介绍了关于如何利用FluentMigrator实现数据库迁移的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
收藏 0 赞 0 分享

ASP.NET Core利用Jaeger实现分布式追踪详解

这篇文章主要给大家介绍了关于ASP.NET Core利用Jaeger实现分布式追踪的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用ASP.NET Core具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
收藏 0 赞 0 分享

浅谈从ASP.NET Core2.2到3.0你可能会遇到这些问题

这篇文章主要介绍了ASP.NET Core2.2到3.0可能会遇到的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

详解.net core webapi 前后端开发分离后的配置和部署

这篇文章主要介绍了.net core webapi 前后端开发分离后的配置和部署,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

详解ASP.Net Core 中如何借助CSRedis实现一个安全高效的分布式锁

这篇文章主要介绍了ASP.Net Core 中如何借助CSRedis实现一个安全高效的分布式锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

.net 4.5部署到docker容器的完整步骤

这篇文章主要给大家介绍了关于.net 4.5部署到docker容器的完整步骤,文中通过示例代码介绍的非常详细,对大家学习或者使用.net4.5具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
收藏 0 赞 0 分享

.net core并发下线程安全问题详解

这篇文章主要给大家介绍了关于.net core并发下线程安全问题的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用.net core具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
收藏 0 赞 0 分享
查看更多