字符串转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
相关产品推荐
相关产品推荐

