无法在 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 查询中将字符串转换为数字类型的主要内容,如果未能解决你的问题,请参考以下文章