【问题标题】:Get nodes from XML URL file in MVC .net从 MVC .net 中的 XML URL 文件获取节点
【发布时间】:2019-04-03 15:43:50
【问题描述】:

我似乎无法从 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# .net model-view-controller view controller


    【解决方案1】:

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

    基于XML schema创建模型:

    [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();
    }
    

    【讨论】:

    • Heloo 先生,我可能对您的解决方案有一些疑问。您是否根据模式“CurrenciesDataSet”命名此模型?你制作的这个新课程与我的“ExchangeRate”课程完全不同?
    • @LaviniaRotaru 对不起,我犯了一个错误,我编辑了我的答案并复制/粘贴了正确的课程。我使用的类与你的不同,因为我创建的类与http://www.bnr.ro/nbrfxrates.xsd的 XML 模式相匹配
    【解决方案2】:

    是的,我已签入所有已修改的内容。

    using MyHR.Domain.Models;
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using System.Xml;
    using System.Xml.Linq;
    using System.Xml.Serialization;
    using static MyHR.Domain.Models.CurrencyDataSet;
    
    namespace MyHR.Web.Controllers
    {
        public class ExchangeRateController : Controller
        {
    
            //        // GET: ExchangeRate
    
    
            public ActionResult ExchangeRate(List<ExchangeRate> data)
            {
    
                {
                    data = new List<ExchangeRate>();
    
                    data = exchangeRates();
    
                    return View(data);
                }
    
    
    
            }
            public List<ExchangeRate> exchangeRates()
            {
    
                CurrenciesDataSet dataset = null;
    
                List<ExchangeRate> 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);
                }
    
    
                Cube cube = dataset.Body.Cubes.FirstOrDefault();
    
                if (cube != null)
                {
                    rates = cube.Rates.Select(x => new ExchangeRate
                    {
                        DataCurenta = cube.Date,
                        Moneda = x.Currency,
                        Valoarea = x.Multiplier.ToString(),
                    }).ToList();
                }
    
                return rates;
            }
        }
    }
    

    这是我的控制器“dataset.Body.Cubes.FirstOrDefault();”将为空。

    这就是我在视图中调用我的控制器的方式:

    @using MyHR.Domain.Models
    @model IEnumerable<ExchangeRate>
    
    <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>
    

    【讨论】:

      猜你喜欢
      • 2018-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多