无法在 xml 查询中将字符串转换为数字类型

Posted

技术标签:

【中文标题】无法在 xml 查询中将字符串转换为数字类型【英文标题】:Can't convert string to number type in xml query 【发布时间】:2020-01-10 00:53:03 【问题描述】:

我有一个从 xml 文件中提取数据的查询。

文件如下所示

<?xml version="1.0" encoding="utf-8" ?>
<CommodityData>
  <Commodity id="Corn">
    <Year value="2019">
     <AcresPlanted value="90005000" />
     <AcresHarvested value="82017000" />
     <AcresProduced value="13900651000" />
     <YieldBuAcre value="169.5" />
    </Year>
    <Year value="2018">
      <AcresPlanted value="89129000" />
      <AcresHarvested value="81740000" />
      <AcresProduced value="14420101000" />
      <YieldBuAcre value="176.4" />
    </Year>
    //...and so on

我有数据的 DTO

public class GrainDataNass

    public string Commodity  get; set; 
    public string Year  get; set; 
    public string AcresPlanted  get; set; 
    public string AcresHarvested  get; set; 
    public string AcresProduced  get; set; 
    public string YieldBuAcre  get; set; 

我可以用这个查询检索所有数据

 public List<GrainDataNass> GetGrainData(string commodity)
    
       var query = _doc.Descendants("Commodity")
            .Where(el => commodity == (string) el.Attribute("id"))
            .Descendants("Year").Select(u => new GrainDataNass
            
                Commodity = commodity,
                Year = u.Attribute("value")?.Value.ToString(),
                AcresPlanted = u.Element("AcresPlanted")?.Attribute("value")?.Value,
                AcresHarvested = u.Element("AcresHarvested")?.Attribute("value")?.Value,
                AcresProduced = u.Element("AcresProduced")?.Attribute("value")?.Value,
                YieldBuAcre = u.Element("YieldBuAcre")?.Attribute("value")?.Value
            ).ToList();

        return query;
    

我使用这些数据生成的图表需要 AcresPlanted、AcresHarvested 等数据字段是数字。小数,因为我将种植面积和生产面积除以 1,000,000,因为它们太大了。 (是的,我更改了 Dto 以反映类型更改)

我尝试在查询本身中这样做,就像这样,首先只使用产量数据,因为它看起来已经像小数了,因为大多数值都是小数,即 156.4、160.3 等


    Commodity = commodity,
    Year = u.Attribute("value")?.Value,
    AcresPlanted = u.Element("AcresPlanted")?.Attribute("value")?.Value,
    AcresHarvested = u.Element("AcresHarvested")?.Attribute("value")?.Value,
    AcresProduced = u.Element("AcresProduced")?.Attribute("value")?.Value,
    YieldBuAcre = Convert.ToDecimal(u.Element("YieldBuAcre")?.Attribute("value")?.Value)
            ).ToList();

我还尝试将其他 3 个值转换为双精度或长整数,以便将它们除以 1,000,000,但所有转换尝试都产生了异常

“输入的字符串格式不正确”

我不能转换查询中的数据吗?从 xml 文件中提取后是否必须转换它?

任何帮助表示赞赏。

【问题讨论】:

【参考方案1】:

Convert.ToDecimal(string) 执行特定于文化的转换,如果您的文化的小数分隔符不是“.”,则可能会失败。

选项 1:使用Convert.ToDecimal(string, CultureInfo.InvariantCulture)

选项 2:XAttribute 具有内置转换工具作为转换运算符,它们根据 XML 规则进行转换,例如(decimal?)attribute。使用第二个选项(我更喜欢),您的代码将是:

_doc.Descendants("Commodity")
        .Where(el => commodity == (string) el.Attribute("id"))
        .Descendants("Year").Select(u => new GrainDataNass
        
            Year = u.Attribute("value")?.Value.ToString(),
            AcresPlanted = u.Element("AcresPlanted")?.Attribute("value")?.Value,
            AcresHarvested = u.Element("AcresHarvested")?.Attribute("value")?.Value,
            AcresProduced = u.Element("AcresProduced")?.Attribute("value")?.Value,
            YieldBuAcre = (decimal?)u.Element("YieldBuAcre")?.Attribute("value")
        ).ToList();

【讨论】:

Gutter...尝试了这两种方法,每种方法都产生相同的异常 你确定输入的数据没有问题?我用你样本的两个 Year 元素进行了测试,效果很好。 Gutter...好吧,这让我查看了文件,是的,我在 xml 部分的末尾有两个空白部分,这可能是问题所在...删除它们后,它现在工作。顺便说一句,(十进制?)这样做的方式不起作用,VS将其视为代码错误 您将属性声明为 decimal 还是 decimal? - 在前一种情况下,如果 YieldBuAcre 始终存在,则将演员替换为 (decimal) Gutter...是的,将属性类型更改为十进制?并在查询中使用(十进制?)。我尝试了十进制和十进制?

以上是关于无法在 xml 查询中将字符串转换为数字类型的主要内容,如果未能解决你的问题,请参考以下文章

无法在 MySQL 查询中将字符串转换为日期时间

JavaScript中将字符串类型转换为整形的函数

如何在 TypeScript 中将字符串转换为数字?

如何在 TypeScript 中将字符串转换为数字?

shell中将字符串转换成数字

如何在 PHP 中将 XML 字符串转换为 DOMDocument?