首页 > 解决方案 > 从 MVC .net 中的 XML URL 文件获取节点

问题描述

我似乎无法从 URL 解析 XML 节点。我目前正在处理的项目(MVC .net)有一个模型,其中包含我想要带来的数据:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

     namespace MyHR.Domain.Models
     {
        public class ExchangeRate


     {
        public string DataCurenta { get; set; }


        public string Moneda { get; set; }


        public string Valoarea { get; set; }

    }
}

然后这是我的控制器(我尝试了不同类型的方法,包括节点,但我已经停止了):

using MyHR.Domain.Models;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Xml;
using System.Xml.Linq;

namespace MyHR.Web.Controllers
{
    public class ExchangeRateController : Controller
    {
        // GET: ExchangeRate

        public ActionResult DisplayXml(List<ExchangeRate> exchangeRates)
        {
            List<ExchangeRate> data = new List<ExchangeRate>();

            data = ReturnData();

            return View(data);
        }


        public List<ExchangeRate> ReturnData()
        {
            string xmldata = @"http://www.bnr.ro/nbrfxrates.xml";
            XDocument Xml = XDocument.Load(xmldata);
            XDocument doc = new XDocument();


            DataSet ds = new DataSet();
            ds.ReadXml(xmldata);

            //Loop through the selected Nodes.

            //XmlNodeList xmlDate = doc.GetElementsByTagName("Cube");
            //XmlNodeList listdata = doc.GetElementsByTagName("Rate");
            var ratelist = new List<ExchangeRate>();
            ratelist = (from ReturnData in doc.Descendants("Cube").Descendants()
                        select new ExchangeRate
                        {
                            DataCurenta = ReturnData.Element("date").ToString(),
                            //Moneda = ReturnData.Element("currency").ToString(),
                            //Valoarea = ReturnData.Element("description").ToString(),

                        }).ToList();


            return ratelist;
        }
    }
}

这是我试图从中获取信息的 XML:http ://www.bnr.ro/nbrfxrates.xml

此外,视图将如下所示:

@using MyHR.Domain.Models
@model IEnumerable<MyHR.Domain.Models.ExchangeRate>

@{
    /**/


    ViewBag.Title = "DisplayXml";
}


<br><br />
<h1 align="center">Cursul valutar din data curenta</h1>
<br><br />
<meta name="Curs Valutar" content="width=device-width" />
<title>Index</title>


<table class="table table-responsive table-bordered">
    <thead style="background-color:#88D0AA">
        <tr align="center">

            <th align="center">
                DataCurenta
            </th>
            <th align="center">
                Moneda
            </th>
            <th align="center">
                Valoarea
            </th>



        </tr>
    </thead>
    <tbody>

        @foreach (ExchangeRate exchange in Model)
        {
            <tr>
                <td>@exchange.DataCurenta</td>

                <td>@exchange.Moneda</td>

                <td>@exchange.Valoarea</td>

            </tr>
        }
    </tbody>
</table>

我将如何搜索 XML 文件的节点并将这些节点也带到视图中?需要的节点是日期、货币和货币的价值。

预先感谢您对我们的支持。

标签: c#.netmodel-view-controllerviewcontroller

解决方案


您可以将 XML 反序列化为 C# 对象,然后使用 linq 提取所需的信息。

基于XML 模式创建模型:

[Serializable]
[XmlRoot("DataSet", Namespace = "http://www.bnr.ro/xsd", IsNullable = false)]
public class CurrenciesDataSet
{
    public Header Header { get; set; }
    public Body Body { get; set; }
}

[Serializable]
public class Header
{
    public string Publisher { get; set; }

    [XmlElement(DataType = "date")]
    public DateTime PublishingDate { get; set; }

    public string MessageType { get; set; }
}

[Serializable]
public class Cube
{
    [XmlElement("Rate")]
    public List<Rate> Rates { get; set; }


    [XmlAttribute("date")]
    public string Date { get; set; }
}

[Serializable]
public class Rate
{
    [XmlAttribute("currency")]
    public string Currency { get; set; }

    [XmlAttribute("multiplier")]
    public int Multiplier { get; set; }

    [XmlText]
    public decimal Value { get; set; }
}


[Serializable]
public class Body
{
    public string Subject { get; set; }

    public string Description { get; set; }

    public string OrigCurrency { get; set; }

    [XmlElement("Cube")]
    public List<Cube> Cubes { get; set; }
}

反序列化 XML 并获取数据 - 示例:

CurrenciesDataSet dataset = null;
var rates = new List<ExchangeRate>();
XDocument doc = XDocument.Load(@"http://www.bnr.ro/nbrfxrates.xml");

using (TextReader sr = new StringReader(doc.ToString(SaveOptions.DisableFormatting)))
{
    var serializer = new XmlSerializer(typeof(CurrenciesDataSet));
    dataset = (CurrenciesDataSet)serializer.Deserialize(sr);
}

// According to the schema there might be multiple <Cube> elements,
// which one do you want??
Cube cube = dataset.Body.Cubes.FirstOrDefault();

if (cube != null)
{
    rates = cube.Rates.Select(x => new ExchangeRate
    {
        DataCurenta = cube.Date,
        Moneda = x.Currency,
        // ....
    }).ToList();
}

推荐阅读