2014-02-11 31 views
0

我有一個創建在XML記錄是這樣的一個bazillion記錄XML文件中的一些硬件:在一段時間使用Python來驗證XML數字字符串

<Reading> 
    <DeviceId>13553678</DeviceId> 
    <Reading>1009735</Reading> 
    <DataStatus>0</DataStatus> 
</Reading> 

每一次,我們將體驗到硬件故障,其中一個字符值被插入到閱讀標籤,就像這樣:

<Reading> 
    <DeviceId>13553678</DeviceId> 
    <Reading>100F735</Reading> 
    <DataStatus>0</DataStatus> 
</Reading> 

不幸的是,消耗這個XML文件將轉儲整個文件與應用「輸入字符串的不正確的格式」的錯誤。我想用Python編寫一箇中介程序,以從xml文件中刪除不良記錄,將它們歸檔,然後重建文件進行處理。我使用python進行簡單的文本處理,但我相信我可以利用一些XML功能。任何幫助,將不勝感激。

+1

嘗試lxml模塊和SAX解析器[SAX](http://lxml.de/sax.html)。 – Keith

回答

0

這可以通過使用lxml模塊和XPath表達式輕鬆完成。另請參閱logging模塊瞭解如何進行正確的日誌記錄。

  • 配置有FileHandler
  • 記錄器獲取所有內部<Reading/>節點
  • 如果他們的文本不僅包括數字位,下降父節點和日誌
from lxml import etree 
import logging 

logger = logging.getLogger() 
logger.addHandler(logging.FileHandler('dropped_readings.log')) 


tree = etree.parse(open('readings.xml')) 

readings = tree.xpath('//Reading/Reading') 
for reading in readings: 
    reading_block = reading.getparent() 
    value = reading.text 

    if not all(c.isdigit() for c in value): 
     reading_dump = etree.tostring(reading_block) 
     logger.warn("Dropped reading '%s':" % value) 
     logger.warn(reading_dump) 
     reading_block.getparent().remove(reading_block) 

print etree.tostring(tree, xml_declaration=True, encoding='utf-8') 

見內置的all()generator epxressions表示條件如何工作。

+0

謝謝。這在我的家用電腦上運行良好,但我的合作伙伴。防火牆一直阻止我導入lxml模塊,所以需要找出解決辦法。 – user3298808

+0

你可能是指*下載*,而不是*導入*,對不對?您應該可以提前從PyPi下載lxml包(https://pypi.python.org/pypi/lxml/3.3.1),通過電子郵件或其他方式發送給您,然後執行'pip install path-to/lxml.tar.gz'。 –