2015-10-12 78 views
2

我想從文件(1,5gb文件)動態解析XML,它看起來像:lxml的iterparse,具有相同的標籤名孩子

<product product_id="x" name="x" sku_number="x"> 
    <category> 
     <primary>x</primary> 
     <secondary>y</secondary> 
    </category> 
    <URL> 
     <product>URL__I_WANT_TO_PULLOUT</product> 
     <productImage>x</productImage> 
    </URL> 
    <description> 
     <short>x</short> 
     <long>x</long> 
    </description> 
</product> 

我使用lxml.etree.iterparse,如:

for event, elem in ET.iterparse(f, events=('end',), tag='product'): 
    save_product(elem) 

我從xml節點獲取所有必需的值。我無法抽出的唯一節點是URL>product(它只是空的)。我認爲這是由相同的標籤名稱引起的。除了iterparse之外,還有什麼辦法可以解析xml嗎?

+0

,如果你的樣品更改名稱,它工作呢? –

+0

我還沒有試過,但它是外部數據饋送,所以我不負責更改它 – mdargacz

回答

2

如果我在樣本上運行etree.iterparse,它會發現'product'標記兩次:有一個外部和一個內部<product>。外部標籤有子元素,其text爲空。所以,你需要跳過這些外部'product'標籤只與那些沒有子元素,例如工作:

for event, elem in etree.iterparse(f, events=('end',), tag='product'): 
    if not len(elem): 
     save_product(elem) 

如果需要處理頂部product標籤的所有內容,可以放下所有的內部product場主循環,然後通過路徑處理所有的子元素,例如python's lxml and iterparse method

def save_product(elem): 
    cat_prim = elem.xpath('category/primary')[0].text; 
    cat_sec = elem.xpath('category/secondary')[0].text; 
    url_prod = elem.xpath('URL/product')[0].text; 
    url_img = elem.xpath('URL/productImage')[0].text; 
    desc_short = elem.xpath('description/short')[0].text; 
    desc_long = elem.xpath('description/long')[0].text; 

for event, elem in etree.iterparse(f, events=('end',), tag='product'): 
    if len(elem): 
     save_product(elem) 
+0

這是正確的,但我正在構建產品數據,所以我需要兩個(子節點的外部和內部文本 ) 與此同時。 – mdargacz

+0

@mdargacz什麼問題?在循環內部或'save_product'功能中,您可以區分內部的''和頂部的''標籤,因此可以根據您的需要對它們進行不同的處理。 –

+0

是的,他們可以處理不同,但有嚴格的相關,如果我有幾十個產品,我可以肯定,解析後的內部頂部,包含該產品的網址?即使這是真的,我可以製作元組(頂部,內部),然後save_product()。但我寧願不以這種拙劣的方式來做到這一點。 – mdargacz

相關問題