2010-07-11 64 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類型的數據進行轉換,但它可以檢測到編碼,所以有可能是一個開始。