XmlToJSON(c#)

简介:

 

using  System.Text; // StringBuilder
using  System.Xml; // xml
using  System.Collections; // SortedList
using  System.Web.UI; // ClientScriptManager



  XmlDocument doc 
=   new  XmlDocument();
  
string  sURL  =   " http://rainmeter.accu-weather.com/widget/rainmeter/weather-data.asp?location=ASI|CN|CH007|YULIN&metric=c " ;
  doc.Load(sURL); 
  
string  JSON  =  XmlToJSON(doc);
  
//  Replace \ with \\ because string is being decoded twice
  JSON  =  JSON.Replace( @" \ " @" \\ " );
  
//  Insert code to process JSON at end of page
  
//  ClientScriptManager cs = Page.ClientScript;
 
// cs.RegisterStartupScript(GetType(), "SpaceJSON", "space_processJSON('" + JSON + "');", true);



 
private   static   string  XmlToJSON(XmlDocument xmlDoc)
    {
        StringBuilder sbJSON 
=   new  StringBuilder();
        sbJSON.Append(
" " );
        XmlToJSONnode(sbJSON, xmlDoc.DocumentElement, 
true );
        sbJSON.Append(
" } " );
        
return  sbJSON.ToString();
    }

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


    本文转自曾祥展博客园博客,原文链接:http://www.cnblogs.com/zengxiangzhan/archive/2010/03/06/1679570.html,如需转载请自行联系原作者


相关文章
|
2天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
13天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1283 5
|
12天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1312 87
|
1天前
|
弹性计算 安全 数据安全/隐私保护
2025年阿里云域名备案流程(新手图文详细流程)
本文图文详解阿里云账号注册、服务器租赁、域名购买及备案全流程,涵盖企业实名认证、信息模板创建、域名备案提交与管局审核等关键步骤,助您快速完成网站上线前的准备工作。
171 82
2025年阿里云域名备案流程(新手图文详细流程)
|
1天前
|
自然语言处理 前端开发
基于Electron38+Vite7.1+Vue3+Pinia3+ElementPlus电脑端admin后台管理模板
基于最新版跨平台框架Electron38整合Vite7+Vue3+ElementPlus搭建轻量级客户端中后台管理系统解决方案。
151 86