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

字符串转Double格式错误:XML读取转换异常求助

为什么XML节点值已在日志显示但转换Double时触发FormatException?

问题描述

我遇到一个很困惑的问题:XML文件里的节点值明明已经在日志里正常显示了,但调用XmlConvert.ToDouble()转换为Double类型时,却触发了FormatException错误。下面是我的相关代码、XML内容和日志输出,麻烦帮忙找出问题所在。

我的XML内容

<?xml version='1.0' encoding='utf-8'?>
<ssbpreise>
<ggvs>25.15</ggvs>
<einblaspauschale>40</einblaspauschale>
<pelletspreis>2.9</pelletspreis>
<heizoel>0.4865</heizoel>
<mwstpellets>5</mwstpellets>
<mwstheizoel>22</mwstheizoel>
<testparameter>testtest</testparameter>
</ssbpreise>

我的C#代码

double einzelpreispellets = 0, einzelpreisheizoel = 0, einblaspauschale = 0, ggvs = 0, mwstpellets = 0, mwstheizoel = 0;
try {
    if (devmode) writetolog(@"XML lesen.");
    using (XmlReader reader = XmlReader.Create(localFileserverBaseUrl + @"parameter.xml")) {
        while (reader.Read()) {
            if (reader.IsStartElement()) {
                switch (reader.Name.ToString()) {
                    case "pelletspreis":
                        writetolog(string.Format("{0}: gepeichert: {1} - aus xml: {2}", reader.Name.ToString(), einzelpreispellets, reader.ReadString()));
                        einzelpreispellets = XmlConvert.ToDouble(reader.ReadString());
                        break;
                    case "heizoel":
                        writetolog(string.Format("{0}: gepeichert: {1} - aus xml: {2}", reader.Name.ToString(), einzelpreisheizoel, reader.ReadString()));
                        einzelpreisheizoel = XmlConvert.ToDouble(reader.ReadString());
                        break;
                    case "einblaspauschale":
                        writetolog(string.Format("{0}: gepeichert: {1} - aus xml: {2}", reader.Name.ToString(), einblaspauschale, reader.ReadString()));
                        einblaspauschale = XmlConvert.ToDouble(reader.ReadString()); //<=== 第322行,抛出异常的位置
                        break;
                    case "ggvs":
                        writetolog(string.Format("{0}: gepeichert: {1} - aus xml: {2}", reader.Name.ToString(), ggvs, reader.ReadString()));
                        ggvs = XmlConvert.ToDouble(reader.ReadString());
                        break;
                    case "mwstpellets":
                        writetolog(string.Format("{0}: gepeichert: {1} - aus xml: {2}", reader.Name.ToString(), mwstpellets, reader.ReadString()));
                        mwstpellets = XmlConvert.ToDouble(reader.ReadString());
                        break;
                    case "mwstheizoel":
                        writetolog(string.Format("{0}: gepeichert: {1} - aus xml: {2}", reader.Name.ToString(), mwstheizoel, reader.ReadString()));
                        mwstheizoel = XmlConvert.ToDouble(reader.ReadString());
                        break;
                    default:
                        writetolog(string.Format("Parameter konnte nicht zugeordnet werden : {0} | Wert: {1}", reader.Name.ToString(), reader.ReadString()));
                        break;
                }
            }
        }
    }
} catch(Exception e) {
    writetolog("Error: " + e);
    return;
}

日志输出

12:07:09: einblaspauschale: from the variabledeclaration: 0 - from xml: 40
12:07:09: Error: System.FormatException: The input string is in the wrong format
at System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt)
at System.Xml.XmlConvert.ToDouble(String s)
at Webshopfiletransfer.Webshopfiletransfer.createCSVFile() in Webshopfiletransfer.cs:Row 322.

问题分析与解决方案

问题的核心在于你对同一个节点调用了两次reader.ReadString()!

XmlReader是一个只进式的流读取器,一旦调用ReadString(),它就会读取当前节点的全部内容,并将指针移动到节点末尾。所以第一次调用reader.ReadString()时,你确实拿到了正确的40并输出到日志,但第二次再调用时,已经没有内容可以读取了,返回的是空字符串。空字符串当然无法转换为Double类型,于是抛出了FormatException。

解决方法很简单:把ReadString()的结果先存储到一个临时变量中,然后同时用于日志输出和类型转换。修改后的代码示例如下:

case "einblaspauschale":
    string nodeValue = reader.ReadString();
    writetolog(string.Format("{0}: gepeichert: {1} - aus xml: {2}", reader.Name.ToString(), einblaspauschale, nodeValue));
    einblaspauschale = XmlConvert.ToDouble(nodeValue);
    break;

你需要把所有switch分支都改成这种写法,避免重复调用ReadString()。这样就能保证你转换的是同一个从XML中读取到的有效字符串,不会再触发格式错误了。

内容的提问来源于stack exchange,提问作者user2632918

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:23:11