将 XML 读入 DataTable 时出现 FormatException

Posted

技术标签:

【中文标题】将 XML 读入 DataTable 时出现 FormatException【英文标题】:FormatException on Reading XML into DataTable 【发布时间】:2015-09-30 09:42:44 【问题描述】:

我正在使用函数 datatable.ReadXml(TextReader) 将 XML 转换为 Datatable,代码如下:

DataTable table = new DataTable("Document");
... (Add the Columns to the Table)
TextReader textReader = new StringReader(xmlString);
table.ReadXml(textReader);

xml 是从其他服务器生成的。 (DMS)

这几乎适用于每台机器。 但在一台 Windows 8.1 计算机上,该表达式会引发以下错误:

System.FormatException: Die Eingabezeichenfolge hat das falsche Format.
   bei System.Number.ParseSingle(String value, NumberStyles options, NumberFormatInfo numfmt)
   bei System.Single.Parse(String s, NumberStyles style, IFormatProvider provider)
   bei System.Xml.XmlConvert.ToSingle(String s)
   bei System.Data.Common.SingleStorage.ConvertXmlToObject(String s)
   bei System.Data.XmlDataLoader.LoadColumn(DataColumn column, Object[] foundColumns)
   bei System.Data.XmlDataLoader.LoadTable(DataTable table, Boolean isNested)
   bei System.Data.XmlDataLoader.LoadData(XmlReader reader)
   bei System.Data.DataTable.ReadXml(XmlReader reader, Boolean denyResolving)

通过尝试和错误测试,我发现出现以下问题:在一个 XML 节点中存在格式为 yyyy-MM-dd 的日期。不知何故,方法 ReadXml 无法在特定机器上解析此日期。

两台机器(工作机器和不工作机器)的文化是: Thread.CurrentThread.CurrentCulture: de-CH Thread.CurrentThread.CurrentUICulture: de-DE

当我将不工作系统上的系统文化更改为 en-CA 时。它工作正常。

问题是什么? 我该如何解决?

这里是一个示例 XML: XML 看起来像:

<?xml version="1.0" encoding="utf-16"?>
<DocumentInfo>
    <DocumentList>
        <DocCount>1</DocCount>
        <FoundMore>False</FoundMore>
        <Document>
            <DocID>KG0000001</DocID>
            <DocType>01. Administration</DocType>
            <DocTypeShort>DADMI</DocTypeShort>
            <DocNumber>B_10000</DocNumber>
            <LastReleasedVersion>0</LastReleasedVersion>
            <ImportDate>2014-05-22</ImportDate>
            <DocState>Freigabe</DocState>
            <FileType>PDF</FileType>
            <FileSizeBytes>678617</FileSizeBytes>
            <FileSizeKB>662.71</FileSizeKB>
            <OriginalFilename>B_10000</OriginalFilename>
            <DocChangedAt>2014-05-22</DocChangedAt>
            <Origin/>
            <dok_dat_feld_1>39099</dok_dat_feld_1>
            <dok_dat_feld_2>11364</dok_dat_feld_2>
            <dok_dat_feld_3>Anträge</dok_dat_feld_3>
            <dok_dat_feld_4>Fragen.pdf</dok_dat_feld_4>
            <dok_dat_feld_9>männlich</dok_dat_feld_9>
            <dok_dat_feld_12>6.41.11.72</dok_dat_feld_12>
            <dok_dat_feld_13>Nein</dok_dat_feld_13>
            <dok_dat_feld_21>Jxxx</dok_dat_feld_21>
            <dok_dat_feld_50>2013-11-27</dok_dat_feld_50>
            <dok_dat_feld_51>2014-04-08</dok_dat_feld_51>
            <dok_dat_feld_54>2014-05-22</dok_dat_feld_54>
        </Document>
    </DocumentList>
</DocumentInfo> 

【问题讨论】:

XML 是什么样子的? 一种文化中的 31.25 相当于 31,25 并且由于文化差异而存在歧义的日期也是如此,您可以根据您的 xml 定义文化,然后将其转换为客户端文化 我真的不知道如何回答这个问题,但刚刚看了两个非常相似的问题,这两个都表明这个页面可能很有趣:msdn.microsoft.com/en-us/library/… @Carra 我将 xml 发布到我的问题中 看看这个答案是否有帮助:***.com/a/2292600/2258 【参考方案1】:

你可以通过这样做来修复它:

DataTable table = new DataTable();
table.Locale = CultureInfo.InvariantCulture;

另一种解决方案似乎是将 XML 的创建更改为使用 WriteXml 等效项。

【讨论】:

我已经尝试过了。它不会改变任何东西。我无法更改 XML 的创建。感谢您的回答。

以上是关于将 XML 读入 DataTable 时出现 FormatException的主要内容,如果未能解决你的问题,请参考以下文章

从 S3 将嵌套文本文件读入 spark 时出现内存错误

将 JSON 文件读入 Spark 时出现 _corrupt_record 错误

销毁 DataTable 时出现 IE 错误

将表格头部的列与主体对齐时出现问题[重复]

为dataTable jquery插件获取数组时出现“非法字符串偏移”错误

DataTable 整行为空时,去除空行,常用于Excel导入,转换为DataTable时出现