You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用C# Xml to Linq解析复杂XML:新手求助获取油价

解决XML油价解析的问题

嘿,我来帮你搞定这个XML解析的困扰!作为新手碰到复杂XML确实容易懵,我先帮你梳理下问题所在,再给你修正后的代码。

首先,你的原代码最核心的问题应该是节点层级定位错了——那个API的XML里,pricetype节点并不是直接挂在country节点下的,而是嵌套在更下层的节点(比如fuel或者fuels子节点)里。另外,原代码里直接用.Value和First()还容易触发空引用异常,得做安全处理。

修正后的安全版代码

// 加载XML文档
XDocument xDoc = XDocument.Load("http://www.petrol.eu/api/fuel_prices.xml");

// 安全定位到Slovenia的country节点,避免找不到节点或属性为空时报错
var sloveniaCountry = xDoc.Descendants("country")
    .FirstOrDefault(country => country.Attribute("label")?.Value == "Slovenia");

if (sloveniaCountry != null)
{
    // 找到对应95号汽油的fuel节点(你可以根据实际油品类型调整type值)
    var petrol95 = sloveniaCountry.Descendants("fuel")
        .FirstOrDefault(fuel => fuel.Attribute("type")?.Value == "95");

    if (petrol95 != null)
    {
        // 提取油价值,同样做空安全处理
        var price = petrol95.Descendants("pricetype")
            .FirstOrDefault(pt => pt.Attribute("type")?.Value == "price")?.Value;

        // 给控件赋值,处理空值情况
        txtBVnosi.Text = string.IsNullOrEmpty(price) ? "无法获取油价" : price;
    }
    else
    {
        txtBVnosi.Text = "未找到95号汽油的信息";
    }
}
else
{
    txtBVnosi.Text = "未找到斯洛文尼亚的油价数据";
}

代码里的关键改进点

  • 空安全处理:用FirstOrDefault()替代First(),找不到节点时不会抛出异常;用?.空条件运算符,避免属性不存在时触发空引用错误。
  • 节点层级修正:根据该API XML的实际结构,先找到country下的fuel节点(对应不同油品),再从fuel里提取pricetype的价格值。
  • 友好的错误提示:增加了多层判断,当某个节点找不到时,给用户明确的提示,方便排查问题。

小建议帮你快速定位节点

你可以先打开那个XML链接,或者在代码里加一行Console.WriteLine(xDoc.ToString());,把整个XML结构打印出来,这样就能清晰看到:

  • country节点下有哪些子节点(比如是不是有fuels容器)
  • 每种油品对应的节点名称和属性(比如是fuel还是product,type属性值是95还是RON95)
  • pricetype到底嵌套在哪一层

这样你就能根据实际结构微调代码里的节点名称,确保精准提取数据啦!

内容的提问来源于stack exchange,提问作者Luka S.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:02:41