C# XML转JSON,不引用第三方JSON.NET类库
应用场景:需要调用第三方接口(返回XML)数据,然后供自己多个系统使用(涉及跨域,使用JSONP)
代理:调用接口(把XML转换为JSONP解决跨域问题)
B/S应用系统:调用代理返回的数据进行UI显示
支持XML无限级节点,支持同级同名节点数据合并(尚未做单元测试,如果还有其他bug请底部留言,我会改进并更新到园子)
TIPS:不支持XML Attribute,有需要可以自己实现
直接上代码:
/// <summary>
/// XML转换为JSON(忽略XML Node Attribute)
/// </summary>
/// <param name="xml"></param>
/// <returns></returns>
public static string ParseXml2Json(string xml)
{
if (string.IsNullOrEmpty(xml)) return string.Empty;
Func<XElement, int?, string> _fun = null;
_fun = (XElement node, int? nodeCount) =>
{
int thisNodeCount = nodeCount ?? ;
StringBuilder s = new StringBuilder();
int count = node.Elements().Count();
if (!node.HasElements)
{
if (thisNodeCount <= )
{
s.AppendFormat("\"{0}\":\"{1}\"", node.Name.LocalName, node.Value);
}
else
{
s.AppendFormat("\"{0}\"", node.Value);
}
}
else
{ if (count == )
{
var childNode = node.Elements().FirstOrDefault();
s.AppendFormat("\"{0}\":{1}", node.Name.LocalName, _fun(childNode, childNode == null ? : ));
}
else
{
//检测子元素localName是否全部一致,如果一致则使用[]集合,否则为{}
//抽取Localname唯一
var LocalNames = node.Elements().Select(t => t.Name.LocalName).Distinct();
string NodesJson = string.Empty;
NodesJson += string.Format("\"{0}\":", node.Name.LocalName);
int ChildNameCount = node.Elements().Select(t => t.Name.LocalName).Distinct().Count();
#region 如果存在重复节点,则合并同类项,格式为key:[]
if (ChildNameCount != node.Elements().Count())
{
//子元素有重复,递归节点
NodesJson += "[";
foreach (string key in LocalNames)
{
NodesJson += string.Format("{{\"{0}\":[", key);
foreach (var nd in node.Elements(key))
{
NodesJson += _fun(nd, node.Elements(key).Count()) + ",";
}
NodesJson = NodesJson.TrimEnd(new char[] { ',' });
NodesJson += "]},";
}
NodesJson = NodesJson.TrimEnd(new char[] { ',' });
NodesJson += "]";
s.AppendFormat("{0}", NodesJson);
}
#endregion
#region 如果无重复节点,则不合并
else
{
//子元素无重复
NodesJson = "{";
foreach (var nd in node.Elements())
{
string json = _fun(nd, );
NodesJson += json + ",";
}
NodesJson = NodesJson.TrimEnd(new char[] { ',' });
NodesJson += "}";
//判断父节点,同名项数量
if (thisNodeCount <= )
{
s.AppendFormat("\"{0}\":{1}", node.Name.LocalName, NodesJson);
}
else
{
s.AppendFormat("{0}", NodesJson);
}
}
#endregion
}
}
return s.ToString();
};
XDocument xd = XDocument.Parse(xml);
if (xd == null) return string.Empty;
return string.Format("{{{0}}}", _fun(xd.Root, null));
}
解析XML:
<?xml version="1.0" encoding="UTF-8"?><resp><city>武汉</city><updatetime>14:25</updatetime><wendu>23</wendu><fengli>0级</fengli><shidu>88%</shidu><fengxiang>北风</fengxiang><sunrise_1>6:03</sunrise_1><sunset_1>18:42</sunset_1><sunrise_2></sunrise_2><sunset_2></sunset_2><environment><aqi>25</aqi><pm25>17</pm25><suggest>各类人群可自由活动</suggest><quality>优</quality><MajorPollutants></MajorPollutants><o3>57</o3><co>1</co><pm10>21</pm10><so2>6</so2><no2>22</no2><time>14:00:00</time></environment><alarm><cityKey>10120</cityKey><cityName><![CDATA[湖北省]]></cityName><alarmType><![CDATA[暴雨]]></alarmType><alarmDegree><![CDATA[黄色]]></alarmDegree><alarmText><![CDATA[湖北省气象台发布暴雨黄色预警]]></alarmText><alarm_details><![CDATA[武汉中心气象台2014年09月02日11时18分发布暴雨黄色预警信号:预计未来6小时,宣恩、鹤峰、罗田有50毫米以上降水,请注意防范滑坡等灾害。]]></alarm_details><standard><![CDATA[6小时内降雨量将达50毫米以上,或者已达50毫米以上且降雨可能持续。]]></standard><suggest><![CDATA[1、政府及相关部门按照职责做好防暴雨工作;2、交通管理部门应当根据路况在强降雨路段采取交通管制措施,在积水路段实行交通引导;3、切断低洼地带有危险的室外电源,暂停在空旷地方的户外作业,转移危险地带人员和危房居民到安全场所避雨;4、检查城市、农田、鱼塘排水系统,采取必要的排涝措施。]]></suggest><imgUrl><![CDATA[http://static.etouch.cn/apps/weather/alarm_icon-1/warning_rainstorm_yellow-1.png]]></imgUrl><time>2014-09-02 12:03:37</time></alarm><yesterday><date_1>1日星期一</date_1><high_1>高温 29℃</high_1><low_1>低温 22℃</low_1><day_1><type_1>中雨</type_1><fx_1>微风</fx_1><fl_1>小于3级</fl_1></day_1><night_1><type_1>中雨</type_1><fx_1>微风</fx_1><fl_1>小于3级</fl_1></night_1></yesterday><forecast><weather><date>2日星期二</date><high>高温 23℃</high><low>低温 19℃</low><day><type>中雨</type><fengxiang>微风</fengxiang><fengli>小于3级</fengli></day><night><type>多云</type><fengxiang>微风</fengxiang><fengli>小于3级</fengli></night></weather><weather><date>3日星期三</date><high>高温 29℃</high><low>低温 19℃</low><day><type>多云</type><fengxiang>微风</fengxiang><fengli>小于3级</fengli></day><night><type>多云</type><fengxiang>微风</fengxiang><fengli>小于3级</fengli></night></weather><weather><date>4日星期四</date><high>高温 28℃</high><low>低温 20℃</low><day><type>多云</type><fengxiang>微风</fengxiang><fengli>小于3级</fengli></day><night><type>多云</type><fengxiang>微风</fengxiang><fengli>小于3级</fengli></night></weather><weather><date>5日星期五</date><high>高温 26℃</high><low>低温 21℃</low><day><type>多云</type><fengxiang>微风</fengxiang><fengli>小于3级</fengli></day><night><type>多云</type><fengxiang>微风</fengxiang><fengli>小于3级</fengli></night></weather><weather><date>6日星期六</date><high>高温 29℃</high><low>低温 21℃</low><day><type>多云</type><fengxiang>微风</fengxiang><fengli>小于3级</fengli></day><night><type>多云</type><fengxiang>微风</fengxiang><fengli>小于3级</fengli></night></weather><weather><date>7日星期日</date><high>高温 28℃</high><low>低温 22℃</low><day><type>多云</type><fengxiang>微风</fengxiang><fengli>小于3级</fengli></day><night><type>多云</type><fengxiang>微风</fengxiang><fengli>小于3级</fengli></night></weather><weather><date>8日星期一</date><high>高温 33℃</high><low>低温 27℃</low><day><type>多云</type><fengxiang>微风</fengxiang><fengli>小于3级</fengli></day><night><type>多云</type><fengxiang>微风</fengxiang><fengli>小于3级</fengli></night></weather></forecast><zhishus><zhishu><name>感冒指数</name><value>少发</value><detail>各项气象条件适宜,无明显降温过程,发生感冒机率较低。</detail></zhishu><zhishu><name>紫外线指数</name><value>最弱</value><detail>属弱紫外线辐射天气,无需特别防护。若长期在户外,建议涂擦SPF在8-12之间的防晒护肤品。</detail></zhishu><zhishu><name>穿衣指数</name><value>舒适</value><detail>建议着长袖T恤、衬衫加单裤等服装。年老体弱者宜着针织长袖衬衫、马甲和长裤。</detail></zhishu><zhishu><name>舒适度</name><value>舒适</value><detail>白天不太热也不太冷,风力不大,相信您在这样的天气条件下,应会感到比较清爽和舒适。</detail></zhishu><zhishu><name>洗车指数</name><value>不宜</value><detail>不宜洗车,未来24小时内有雨,如果在此期间洗车,雨水和路上的泥水可能会再次弄脏您的爱车。</detail></zhishu><zhishu><name>旅游指数</name><value>一般</value><detail>温度适宜,有微风同行,但较强降雨的天气将给您的出行带来很多的不便,若坚持旅行建议带上雨具。</detail></zhishu><zhishu><name>运动指数</name><value>较不宜</value><detail>有较强降水,建议您选择在室内进行健身休闲运动。</detail></zhishu><zhishu><name>晨练指数</name><value>不宜</value><detail>有较强降水,请避免户外晨练,建议在室内做适当锻炼,保持身体健康。</detail></zhishu><zhishu><name>约会指数</name><value>不适宜</value><detail>较强降水天气会给室外约会增添许多麻烦,如无必要,请不要外出,最好在室内促膝谈心。</detail></zhishu><zhishu><name>逛街指数</name><value>较不宜</value><detail>较强降水,较不宜逛街,若坚持出门,请您记得带上雨具。</detail></zhishu><zhishu><name>晾晒指数</name><value></value><detail></detail></zhishu><zhishu><name>雨伞指数</name><value>带伞</value><detail>有较强降水,您在外出的时候一定要带雨伞,以免被雨水淋湿。</detail></zhishu></zhishus></resp><!-- 127.0.0.1(127.0.0.1):40484 ; 127.0.0.1:8080 -->
解析后效果如图:

C# XML转JSON,不引用第三方JSON.NET类库的更多相关文章
- IOS 编程中引用第三方的方类库的方法及常见问题
方法一:直接复制全部源文件到项目中 这样的方法就是把第三方类库的全部源文件拷贝到项目中,直接把全部.h和.m文件拖到XCode项目中就可以. 注意: 1. 假设第三方类库引用了一些系统自带类库,那么在 ...
- Atitit.json xml 序列化循环引用解决方案json
Atitit.json xml 序列化循环引用解决方案json 1. 循环引用1 2. 序列化循环引用解决方法1 2.1. 自定义序列化器1 2.2. 排除策略1 2.3. 设置序列化层次,一般3级别 ...
- 【JSON 注解】JSON循环引用1-----Jackson常用注解介绍 eq:@JsonIgnore
循环引用:实体A与实体B有关系,A中有B作为字段,B中有A作为一个字段.查询A对象后,将A对象转化为JSON格式数据时,会因为序列化过程中导致A中有B字段,B字段中又有A,这样就引起了循环引用的问题! ...
- 【JSON 注解】JSON循环引用2----JSON注解@JsonIgnoreProperties+JAVA关键字transient+后台对象与JSON数据的格式互相转化
接着来说这个JSON循环引用的问题: 关于JSON格式的转化,其实关键就是这几个依赖: <!-- json --> <!-- 1号 --> <dependency> ...
- 将XML文件中的内容转换为Json对象
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Xml;u ...
- vue项目中使用bpmn-流程图xml文件中节点属性转json结构
内容概述 本系列“vue项目中使用bpmn-xxxx”分为七篇,均为自己使用过程中用到的实例,手工原创,目前陆续更新中.主要包括vue项目中bpmn使用实例.应用技巧.基本知识点总结和需要注意事项,具 ...
- [.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类
[.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类 本节导读: 关于JSON序列化,不能 ...
- json和jsonp(json是目的,jsonp是手段)
自己理解:JSON是一种数据交换格式,而JSONP是一种依靠开发人员的聪明才智创造出的一种非官方跨域数据交互协议.我们拿最近比较火的谍战片来打个比方,JSON是地下党们用来书写和交换情报的" ...
- json解包与json封包
首先,对两个名词进行简单的说明: 1.NSData 用来存储二进制的数据类型.NSData类提供了一种简单的方式,它用来设置缓冲区.将文件的内容读入缓冲区,或将缓冲区的内容写到一个文件.不变缓冲区(N ...
随机推荐
- 配置android sdk 环境
1:下载adnroid sdk安装包 官方下载地址无法打开,没有vpn,使用下面这个地址下载,地址:http://www.android-studio.org/
- JS核心系列:浅谈 call apply 与 bind
在JavaScript 中,call.apply 和 bind 是 Function 对象自带的三个方法,这三个方法的主要作用是改变函数中的 this 指向,从而可以达到`接花移木`的效果.本文将对这 ...
- 利用on和off方法编写高效的js代码
先说下将这个话题的起因:最近发现公司的功能代码,很多在dom对象删除以后,其声明的绑定在window上的resize事件还一直存在,导致相同的功能代码执行了几次.对于我这种轻微代码洁癖的人来说,简直是 ...
- angular2系列教程(七)Injectable、Promise、Interface、使用服务
今天我们要讲的ng2的service这个概念,和ng1一样,service通常用于发送http请求,但其实你可以在里面封装任何你想封装的方法,有时候控制器之间的通讯也是依靠service来完成的,让我 ...
- C++随笔:.NET CoreCLR之corleCLR核心探索之coreconsole(1)
一看这个标题,是不去取名有点绕呢?或者是,还有些问题?报告LZ...你的标题取得有问题,是个病句!↖(^ω^)↗!!!先不要急,其实我今天带给大家的就是CoreCLR中的coreclr.其中它是在名字 ...
- 在Visual Studio Code中配置GO开发环境
一.GO语言安装 详情查看:GO语言下载.安装.配置 二.GoLang插件介绍 对于Visual Studio Code开发工具,有一款优秀的GoLang插件,它的主页为:https://github ...
- 【JS基础】循环
for 循环的语法: for (语句 1; 语句 2; 语句 3) { 被执行的代码块 } 语句 1 在循环(代码块)开始前执行 语句 2 定义运行循环(代码块)的条件 语句 3 在循环(代码块)已被 ...
- Atitit.如何建立研发体系
Atitit.如何建立研发体系 组织,流程,prj..Mana oppm 发管理是一个完整的管理体系,从结构上来讲,它主要由四个方面的内容构架而成:组织结构与岗位设置 管理流程与工作流程..项目及管 ...
- 搭建个人wordpress博客(小白教程)
新浪sae平台现在是有个免费个人空间使用,现在,教您如何使用该平台搭建属于自己的个人网站,本教程以wordpress程序安装包搭建个人网站. 申请新浪云账号 如果我们使用SAE新浪云计算平台作为服务器 ...
- 史上最全Windows版本搭建安装React Native环境配置
史上最全Windows版本搭建安装React Native环境配置 配置过React Native 环境的都知道,在Windows React Native环境配置有很多坑要跳,为了帮助新手快速无误的 ...