2010-07-11 61 views
0

我有一些XML标记的字符串,如下所示。使用python从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” - >字符串,“2.31” - >“浮动”等。

我需要这个功能,因为我需要让SQLite表出来的XML数据像

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

回答

3

一种可能性是按照精确顺序尝试各种类型,如果这些工作都不起作用,则默认为str。例如: -

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',等等。如果您需要不同的语法约定,那么您应该对字符串s执行解析,无论是通过RE还是通过其他方式。

+0

如何返回“int”而不是? – prosseek 2010-07-11 23:33:33

+0

向“possible_types”数组中的元组添加第三个值,该数组是该类型的字符串表示形式;然后修改for循环为'for t,xargs,stype:'然后'return stype'。 – Amber 2010-07-11 23:39:01

+0

@Amber:谢谢,它有效。 – prosseek 2010-07-11 23:43:18

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' 

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

0

BeautifulSoup是一个不错的HTML/XML解析器:

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

我不能完全肯定是否可以给出一个XSD/XSL类型的数据进行转换,但它可以检测到编码,所以有可能是一个开始。