使用python从XML字符串中检测数据类型

时间:2010-07-11 23:02:34

标签: python sqlite

我有一些XML标记的字符串如下。

<Processor>AMD Athlon(tm) 64 X2 Dual Core Processor 4400+ 2.31 GHz</Processor>
<ClockSpeed>2.31</ClockSpeed>
<NumberOfCores>2</NumberOfCores>
<InstalledMemory>2.00</InstalledMemory>
<OperatingSystem>Windows 7 Professional</OperatingSystem>

如何使用python自动检测数据类型? 例如,“AMD Athlon(tm)64 X2双核处理器4400+ 2.31 GHz” - &gt;字符串,“2.31” - &gt;漂浮,等等。

我需要这个功能,因为我需要从XML数据中创建SQLite表,如

CREATE table ABC (Processor string, ClockSpeed float ... )

3 个答案:

答案 0 :(得分:3)

一种可能性是以精确的顺​​序尝试各种类型,如果这些都不起作用,则默认为str。 E.g:

def what_type(s, possible_types=((int, [0]), (float, ()))):
    for t, xargs in possible_types:
        try: t(s, *xargs)
        except ValueError: pass
        else: return t
    return str

当然,当您使用与Python完全相同的语法约定时,这是特别可取的 - 例如,接受'0x7e'作为int以及'126',等等上。如果您需要不同的语法约定,那么您应该通过RE或其他方式对字符串s执行解析。

答案 1 :(得分:2)

根据您期望的格式类型,您可以使用正则表达式来检测浮点数和整数,然后假设任何无法解析为数字的字符串都是字符串,如下所示:

import re

FLOAT_RE = re.compile(r'^(\d+\.\d*|\d*\.\d+)$')
INT_RE = re.compile(r'^\d+$')

# ... code to get xml value into a variable ...

if FLOAT_RE.match(xml_value):
    value_type = 'float'
elif INT_RE.match(xml_value):
    value_type = 'int'
else:
    value_type = 'string'

这只是一个非常基本的尝试 - 有更复杂的格式来表达可能的数字;如果你认为你可能期望一些更复杂的格式,你必须扩展它以使其在所有情况下都能正常工作。

答案 2 :(得分:0)

BeautifulSoup是一个很好的HTML / XML解析器:

http://www.crummy.com/software/BeautifulSoup/

我不完全确定它是否可以在给定xsd / xsl的情况下按类型转换数据,但它可以检测编码,因此可能有一个开始。