c# - 从 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 文件的节点并将这些节点也带到视图中?需要的节点是日期、货币和货币的价值。
预先感谢您对我们的支持。
解决方案
您可以将 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();
}
推荐阅读
- reactjs - 如何使用 Axios 从 React 中经过身份验证的 API 获取数据?
- clojure - def 和 resolve 在同一个 clojure 宏中
- ios - 将 JSON 响应概括为函数参数
- vespa - 叶组的预期数量是冗余的一个因素,但它不是
- node.js - 无法安装最新的 npm
- python - Keras 后端(张量流)与 Keras
- ruby - 在ruby中将数组作为参数添加到sql查询
- ruby-on-rails - Rails before_create 按字母顺序递增
- svm - 径向基函数 (RBF) 内核
- python - 使用 db-api 进行 Python 类型提示