C# - 如何从 xml 中获取特定值

Posted

技术标签:

【中文标题】C# - 如何从 xml 中获取特定值【英文标题】:C# - how to get a specific value from a xml 【发布时间】:2020-02-25 22:51:09 【问题描述】:

我知道这个问题被问了很多,但我找不到适合我的问题。 我正在尝试使用他们的 RSS 提要从 BBC Weather 获取天气。 在这个 RSS 提要中,我试图获取第二个标题 (**) 的值。

Rss 提要:

<?xml version="1.0" encoding="UTF-8"?>
<rss>
  <channel>
    <title>BBC Weather - Observations for  Hampstead, GB</title>
    <link>https://www.bbc.co.uk/weather/2647553</link>
    <description>Latest observations for Hampstead from BBC Weather, </description>
    <language>en</language>
    <copyright>Copyright: (C) British Broadcasting Corporation,</copyright>
    <pubDate>Wed, 30 Oct 2019 14:00:00 GMT</pubDate>
    <dc:date>2019-10-30T14:00:00Z</dc:date>
    <dc:language>en</dc:language>
    <dc:rights>Copyright: (C) British Broadcasting Corporation, </dc:rights>
    <atom:link rel="self" />
    <item>
      **<title>Wednesday - 14:00 GMT: Not available, 11°C (52°F)</title>**
      <link>https://www.bbc.co.uk/weather/2647553</link>
      <description>Temperature: 11°C (52°F), Wind Direction: East South Easterly, Wind Speed: 13mph, Humidity: 58%, Pressure: 1023mb, Falling, Visibility: Excellent</description>
      <pubDate>Wed, 30 Oct 2019 14:00:00 GMT</pubDate>
      <guid isPermaLink="false">https://www.bbc.co.uk/weather/2647553-2019-10-30T14:00:00.000Z</guid>
      <dc:date>2019-10-30T14:00:00Z</dc:date>
      <georss:point>51.5574 -0.1821</georss:point>
    </item>
  </channel>
</rss>

我知道这是错的,但到目前为止我得到的是这样的:

XDocument X = XDocument.Load("https://weather-broker-cdn.api.bbci.co.uk/en/observation/rss/2647553");
var weather = X.Element("channel").Element("item").Element("title").Value;
weather = Regex.Match(weather, @"GMT: (.+?),").Groups[1].Value;
XmlLabel.Text = weather;

我真的找不到任何地方可以清楚地解释它, 提前致谢

【问题讨论】:

您可以使用 Xpath 来选择元素,为什么不同时查看 pubDate 节点或 dc:Date 节点而不是尝试使用正则表达式进行解析,那么您可以获得实际的日期DateTime 数据类型? @Charleh OP 似乎不在日期之后。见regex101.com/r/fBSb1l/1 【参考方案1】:

你的代码开始的层次太深了:

var weather = X.Element("channel").Element("item").Element("title").Value;

您需要从根元素开始,即“rss”。所以这会起作用:

var weather = X.Element("rss").Element("channel").Element("item").Element("title").Value;

但我建议使用较短的 XPath 变体:

X.XPathSelectElement("//item/title").Value;

我使用以下代码在Fiddle 中验证了上述两个变体和您的正则表达式:

XDocument X = XDocument.Load("https://weather-broker-cdn.api.bbci.co.uk/en/observation/rss/2647553");

var test = X.XPathSelectElement("//item/title").Value;
Console.WriteLine(Regex.Match(test, @"GMT: (.+?),").Groups[1].Value);

var weather = X.Element("rss").Element("channel").Element("item").Element("title").Value;
Console.WriteLine(Regex.Match(weather, @"GMT: (.+?),").Groups[1].Value);

输出:

无法使用 无法使用

【讨论】:

以上是关于C# - 如何从 xml 中获取特定值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# ASP.Net 从 XML 文档中获取特定 XML 元素的列表?

如何从 C# 中的 XML Web 服务获取值?

如何在c#中使用xelement获取xml节点值

如何从元素中具有相同名称的 xml 文件中获取特定值?

如何从 RSA 公钥 XML 文件 .net core c# 中获取 n 值

JWT:如何从声明中的特定键获取值列表。 C# Asp.Net 核心