功能简介
好久没写博客了,└༼ ಥ ᗜ ಥ ༽┘!!!
很简单的功能:分别使用System.Xml.XmlDocument
和 Windows.Data.Json
解析并提取服务器端传来的Xml字符串和Json字符串,这里使用聚合数据API 提供的数据,Xml字符串提供12306火车票查询,Json字符串提供天气查询,示例项目将通过返回的字符串提取我们想要的数据并显示出来
实现效果
- Json:天气查询
- Xml:12306 火车票查询
- 输入错误,异常判断
实现过程
获得数据
首先,我们需要从聚合数据中获得数据并且知道返回的数据的格式,在聚合数据上注册,申请数据(部分数据的需要收费,这里使用的天气查询和12306查询首次申请将赠送500次使用次数),将得到下面的结果:
选择一个接口,如天气查询,我们将使用并解析该接口的返回数据得到我们需要的信息,返回的Json字符串如下所示
/* 聚合数据返回的Json字符串数据示例 */
{
"resultcode": "200",
"reason": "查询成功!",
"result": {
/* 该接口返回了相当详细的数据,可以查看官网获得更多信息
* 这里省略了大部分的内容,只显示出了该次实验需要提取的数据
*/
"today": {
"city": "天津",
"date_y": "2014年03月21日",
"week": "星期五",
"temperature": "8℃~20℃", /*今日温度*/
"weather": "晴转霾", /*今日天气*/
"weather_id": { /*天气唯一标识*/
"fa": "00", /*天气标识00:晴*/
"fb": "53" /*天气标识53:霾 如果fa不等于fb,说明是组合天气*/
},
}
}
另一个例子是火车票查询接口,这里我们通过解析Xml字符串获得我们需要的信息
<?xml version="1.0" encoding="utf-8"?>
<root>
<resultcode>200</resultcode>
<reason>查询成功</reason>
<result>
<train_info>
<name>g4</name>
<start>上海虹桥</start>
<end>北京南</end>
<starttime>14:00</starttime>
<endtime>18:28</endtime>
<mileage/>
</train_info>
<station_list>
<!-- 这里省略了一下这次项目没有使用的值,可以查看官网获得更多信息 -->
</station_list>
</result>
</root>
在MainPage.xaml中添加需要的控件
在这里,我们添加两个文本输入框和两个按钮,用于输入我们的信息
<!-- MainPage.xaml -->
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<StackPanel Margin="10">
<TextBox Header="City" Margin="10" x:Name="cityBox"></TextBox>
<Button Content="查询天气" Click="queryWeather" Margin="10" x:Name="button"></Button>
<TextBox Header="Train Id" Margin="10" x:Name="trainBox"></TextBox>
<Button Content="12306火车票查询" Click="queryTrain" Margin="10"></Button>
</StackPanel>
</Grid>
在MainPage.xaml.cs中添加代码
- 添加对应的成员
//MainPage.xaml.cs
/*
* 以查询火车票为例,
* 一般的查询链接为:http://apis.juhe.cn/train/s?name=你想要查询的火车的编号&key=你申请的APPKEY
* 因此根据下面的string对象,在查询时将使用:trainStr + 你想要查询的火车的编号 + trainKey
*/
private string trainStr = "http://apis.juhe.cn/train/s?dtype=xml&name=";
private string weatherStr = "http://v.juhe.cn/weather/index?format=2&cityname=";
//App Key,唯一标识,这里需要替换为你注册申请的链接
private string trainKey = "&key=9ec62157b998149569d54ae25cbaa8e5";
private string weatherKey = "&key=0e3c2dab2c8a77f4bac1138099a812ea";
- 对Json字符串进行解析(查询天气):
//MainPage.xaml.cs
private async void queryWeather(object sender, RoutedEventArgs e)
{
// 根据输入得到Url链接
string url = weatherStr + cityBox.Text.Trim() + weatherKey;
HttpClient httpClient = new HttpClient();
var headers = httpClient.DefaultRequestHeaders;
//使用HttpClient获取数据
HttpResponseMessage response = await httpClient.GetAsync(url);
// 避免中文乱码
response.EnsureSuccessStatusCode();
Byte[] getByte = await response.Content.ReadAsByteArrayAsync();
Encoding code = Encoding.GetEncoding("UTF-8");
string jsonString = code.GetString(getByte, 0, getByte.Length);
// 解析Json对象
JsonObject weatherObject = JsonObject.Parse(jsonString);
// 如果输入正确,返回的Json字符串的resultcode = 200
if (weatherObject.GetNamedString("resultcode").Equals("200"))
{
//根据上面的Json字符串进行解析,得到Json字符串中嵌套的Json字符串
JsonObject skObject = JsonObject.Parse(weatherObject.GetNamedValue("result").ToString());
JsonObject todayObject = JsonObject.Parse(skObject.GetNamedValue("today").ToString());
// 使用StringBuilder,可变字符串
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append("气温 : " + todayObject.GetNamedString("temperature"));
stringBuilder.Append("\n");
stringBuilder.Append("天气 : " + todayObject.GetNamedString("weather"));
stringBuilder.Append("\n");
stringBuilder.Append("风向 : " + todayObject.GetNamedString("wind"));
stringBuilder.Append("\n");
MessageDialog showDialog = new Windows.UI.Popups.MessageDialog(stringBuilder.ToString());
await showDialog.ShowAsync();
}
else
{
//异常判断
MessageDialog errorDialog = new Windows.UI.Popups.MessageDialog("输入错误!!!");
await errorDialog.ShowAsync();
}
}
- 对Xml字符串进行解析(火车票查询):
private async void queryTrain(object sender, RoutedEventArgs e)
{
// 根据输入得到Url链接
string url = trainStr + trainBox.Text.Trim() + trainKey;
HttpClient httpClient = new HttpClient();
var headers = httpClient.DefaultRequestHeaders;
//使用HttpClient获取数据
HttpResponseMessage response = await httpClient.GetAsync(url);
// 避免中文乱码
response.EnsureSuccessStatusCode();
Byte[] getByte = await response.Content.ReadAsByteArrayAsync();
Encoding code = Encoding.GetEncoding("UTF-8");
string xmlString = code.GetString(getByte, 0, getByte.Length);
// 根据返回的Xml字符串创建Xml对象
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlString);
XmlNode root = doc.DocumentElement;
// 如果输入正确,返回的Json字符串的resultcode = 200
if (doc.GetElementsByTagName("resultcode")[0].InnerText.Equals("200"))
{
//根据上面的Xml字符串进行解析
XmlNodeList child = doc.GetElementsByTagName("train_info")[0].ChildNodes;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append("车次 : " + child[0].InnerText);
stringBuilder.Append("\n");
stringBuilder.Append("出发站 : " + child[1].InnerText);
stringBuilder.Append("\n");
stringBuilder.Append("到达站 : " + child[2].InnerText);
stringBuilder.Append("\n");
stringBuilder.Append("出发时间 : " + child[3].InnerText);
stringBuilder.Append("\n");
stringBuilder.Append("到达时间 : " + child[4].InnerText);
stringBuilder.Append("\n");
MessageDialog showDialog = new Windows.UI.Popups.MessageDialog(stringBuilder.ToString());
await showDialog.ShowAsync();
}
else
{
MessageDialog errorDialog = new Windows.UI.Popups.MessageDialog("输入错误!!!");
await errorDialog.ShowAsync();
}
需要注意的地方:
- 根据自己注册和申请的接口修改对应的Url 和 AppKey
- 使用UTF-8避免中文乱码
- 使用
JsonObject
解析Json字符串内嵌的Json字符串,提取我们想要的信息 - 使用
XmlDocument
解析Xml字符串
总结
关于Json字符串和Xml字符串的解析,可以查看微软官方文档获取更加深入的理解 :JsonObject Class,XmlDocument Class
关于UWP网络编程,解析Json字符串和Xml字符串只是冰山一角,有空的话,将会补充其他一些关于网络编程的内容(才怪)
FYI
项目下载:JsonAndXmlSample
项目下载之后记住把Debug模式从ARM换成X86或X64(根据你自己的机型选择),之前一开始学习的时候不知道这一点,从网上下载下来的项目都运行不了,纠结的一逼(╥╯^╰╥)
补充
另一种更加简单的Json字符串解析方法:Newtonsoft.Json
( ̄ε(# ̄)☆╰╮o( ̄皿 ̄///)不早说