将 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内容

将 XML 响应转换为 Json 时出错

soapui与webservice接口测试

Azure APIM:将 JSON 响应转换为自定义 XML 格式

防止 xslt 将 xml 转换为 html

将 XML 字符串 API 响应转换为键值对象 C#