gpt4 book ai didi

c# - 解析 Xml 文档中的指数值

转载 作者:行者123 更新时间:2023-12-04 02:39:59 26 4
gpt4 key购买 nike

反序列化对象(我无法修改)时遇到问题。
我收到某个 xml 元素的指数值,为了在我的类中表示它们,我使用十进制值期望当我反序列化 xml 文档时它失败。

<fwdRate>-9.72316862724032E-05</fwdRate>

除了在我的类中创建 2 个属性来表示它(一个字符串,另一个是十进制值)之外,还有什么解决方案可以表示这个属性?

我可以为十进制值创建自定义反序列化类吗?
        private void ParseXML(string value)
{
XmlSerializer serializer = new XmlSerializer(typeof(SwapDataSynapseResult));
using (TextReader reader = new StringReader(value))
{
_result = serializer.Deserialize(reader) as SwapDataSynapseResult;
}
}

作为需求
using System;
using System.IO;
using System.Xml.Serialization;

[XmlRoot(ElementName = "result")]
public class Result
{
[XmlElement(ElementName = "fwdRate")]
public decimal FwdRate { get; set; }
}
public class Program
{
public static void Main()
{
string val = "<result><fwdRate>-9.72316862724032E-05</fwdRate></result>";
Result response = ParseXML(val);
}
static Result ParseXML(string value)
{
XmlSerializer serializer = new XmlSerializer(typeof(Result));
using (TextReader reader = new StringReader(value))
{
return serializer.Deserialize(reader) as Result;
}
}

}

最佳答案

在 XML 中,十进制值不允许使用科学(指数)表示法(参见“限制”段落中的 this link)。
任何一个:

  • 该值确实是一个浮点数:Put a float/double而不是 decimal在代码中。
  • XML 已损坏。

  • 同理,在C#中,默认是 Decimal.Parse不接受指数表示。
    您可以通过实现一个包含 decimal 的新结构来覆盖此行为。并实现 IXmlSerializable并在反序列化时允许指数表示:
    public struct XmlDecimal : IXmlSerializable
    {
    public decimal Value { get; private set; }

    public XmlDecimal(decimal value) => Value = value;

    public XmlSchema GetSchema() => null;

    public void ReadXml(XmlReader reader)
    {
    var s = reader.ReadElementContentAsString();
    Value = decimal.TryParse(s, NumberStyles.Number | NumberStyles.AllowExponent,
    NumberFormatInfo.InvariantInfo, out var value)
    ? value
    : 0; // If parse fail the resulting value is 0. Maybe we can throw an exception here.
    }

    public void WriteXml(XmlWriter writer) => writer.WriteValue(Value);

    public static implicit operator decimal(XmlDecimal v) => v.Value;

    public override string ToString() => Value.ToString();
    }
    缺陷是你必须使用这个结构而不是 decimal在您的模型中随处可见。
    遗憾的是,您不能将此结构设为只读,已解释 here .

    关于c# - 解析 Xml 文档中的指数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59837911/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com