将 WebService 响应 (XML) 转换为数组或列表以显示在 MVC 列表上
Posted
技术标签:
【中文标题】将 WebService 响应 (XML) 转换为数组或列表以显示在 MVC 列表上【英文标题】:Convert WebService response (XML) to array or list do show on a MVC List 【发布时间】:2018-09-05 07:35:11 【问题描述】:我正在尝试创建一个 Web 应用程序来获取 Web 服务 (http://servicos.cptec.inpe.br/XML/listaCidades) 的响应并将其存储到城市列表中,然后返回带有城市列表的 ActionResult。
<cidades>
<cidade>
<nome>São Benedito</nome>
<uf>CE</uf>
<id>4750</id>
</cidade>
<cidade>
<nome>São Benedito do Rio Preto</nome>
<uf>MA</uf>
<id>4751</id>
</cidade>
<cidade>
<nome>São Benedito do Sul</nome>
<uf>PE</uf>
<id>4752</id>
</cidade>
<cidade>
<nome>São Bentinho</nome>
<uf>PB</uf>
<id>5845</id>
</cidade>
<cidade>
<nome>São Bento</nome>
<uf>MA</uf>
<id>4753</id>
</cidade>
<cidade>
<nome>São Bento</nome>
<uf>PB</uf>
<id>4754</id>
</cidade>
<cidade>
<nome>São Bento Abade</nome>
<uf>MG</uf>
<id>4755</id>
</cidade>
Cidade 类:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using System.Xml.Serialization;
namespace WebApplication1.Models
[Serializable()]
public class Cidade
[XmlElement("nome")]
public string nome get; set;
[XmlElement("uf")]
public string uf get; set;
[XmlElement("id")]
[Key]
public int id get; set;
CidadeCollection 类:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Xml.Serialization;
namespace WebApplication1.Models
[Serializable()]
[XmlRoot("cidades")]
public class CidadeCollection
[XmlArrayItem(typeof(Cidade))]
public List<Cidade> cidades = new List<Cidade>();
CidadeCollection 控制器类:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;
using System.Web.Mvc;
using WebApplication1.Models;
using System.Xml.Serialization;
namespace WebApplication1.Controllers
public class CidadeCollectionController : Controller
// GET: CidadeCollection
public ActionResult Index(string s="")
string conteudo;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://servicos.cptec.inpe.br/XML/listaCidades?city=" + s);
request.Method = "GET";
WebResponse response = request.GetResponse();
CidadeCollection c = new CidadeCollection();
c.cidades = new List<Cidade>();
XmlSerializer ser;
StreamReader reader;
ser = new XmlSerializer(typeof(List<Cidade>));
reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
c.cidades = (List<Cidade>)ser.Deserialize(reader);
return View(c.cidades);
这是我得到的错误:
enter image description here
【问题讨论】:
能否请edit 将异常的完整ToString()
输出包含为作为文本 而不是屏幕截图?原因请见Why not upload images of code on SO when asking a question和Discourage screenshots of code and/or errors。
我该怎么做?错误什么也没说...
您的服务没有响应 XML,这就是问题所在。调试您的服务响应。
我该怎么做?从异常对话框中选择Copiar Detalhes
,然后将生成的文本粘贴到问题中。
【参考方案1】:
好吧,这里有一个简单的方法(小例子,根据需要改进):
在你的Controller
:
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
public ActionResult Foo()
var xml = XDocument.Load("http://servicos.cptec.inpe.br/XML/listaCidades");
var nodes = xml.Descendants("nome");
var xElements = nodes as XElement[] ?? nodes.ToArray();
var foo = new List<string>();
xElements.ForEach(element => foo.Add(element.Value));
ViewData["Nomes"] = new SelectList(foo);
return View();
在你的View
<h2>Foo</h2>
@html.DropDownList("Nomes")
第..
如何获得“cidade”的其他属性?像 ID 和 UF 一样存储在“Cidade”列表中?
根据您的模型:
public class Cidade
public string nome get; set;
public string uf get; set;
public int id get; set;
像这样对上面的进行调整:
var xml = XDocument.Load("http://servicos.cptec.inpe.br/XML/listaCidades");
//all the cidade elements
var nodes = xml.Descendants("cidade");
var xElements = nodes as XElement[] ?? nodes.ToArray();
var foo = new List<Cidade>();
//iterate through the cidade elements and map them to your model
Array.ForEach(xElements, element =>
foo.Add(new Cidade
id = int.Parse(element.Element("id").Value), //or TryParse
nome = element.Element("nome").Value,
uf = element.Element("uf").Value
);
);
//foo now has your List (of Cidade)
//do whatever you need to do with it....
foo.ForEach(c => Console.WriteLine($"c.id | c.nome | c.uf"));
第...
【讨论】:
伙计,这看起来很棒!但是我怎样才能得到“cidade”的其他属性呢?像 ID 和 UF 一样存储在“Cidade”列表中? @ArthuroVerissimo 希望您可以根据示例自行探索XDocument
...无论如何,更新答案...以上是关于将 WebService 响应 (XML) 转换为数组或列表以显示在 MVC 列表上的主要内容,如果未能解决你的问题,请参考以下文章
.net WebService接口参数为实体类数组,java调用接口怎么把参数转换成string类型的xml内容