Python:扁平化xml,仅提取直接子级而不嵌套子级

时间:2019-05-31 13:04:45

标签: python xml

我希望将xml展平为csv,对于每个嵌套的子项,我想复制直接子项的值,这两个子项具有相同的标记名。这是示例xml。对于“ claim”标签内的每个“ entry”值,我想为“ Insurer”的直接子项打印所有值。我确实尝试过findall,但它也检索了“ claim”下的“ entry”的值。

注意:我正在使用ElementTree进行解析

$sql = "DELETE FROM `".$config_databaseTablePrefix."table2` WHERE id = ?";
database_preparedModify($sql,'s',$insertId, $feed["id"]);
<Parent>
       <Branch>
             <Insurer>
                  <claim>                    
                     <entry>1</entry>
                     <entry>2</entry>
                  </claim>
                  <entry>outer</entry>
                  <entry>outer1</entry>
                  <entry>outer2</entry>
              </Insurer>
        </Branch>
</Parent>

预期结果:

Entry= child.findall('.//{http://trying.nz}entry')

1 个答案:

答案 0 :(得分:0)

您没有提到正在使用的xml解析库,但这是基于ElementTree的工作代码示例。

它确实使用find函数对XML数据的结构进行了假设,该函数仅深入一层。

#!/usr/bin/env python3                                                          

import xml.etree.ElementTree as ET                                          

from csv import writer as csvwriter                                         
from itertools import product                                                  

tree = ET.parse("input.xml")                                                   

claims = [                                                                     
    entry.text                                                                 
    for entry in tree.find("Branch")                                           
    .find("Insurer")                                                           
    .find("claim")                                                             
    .findall("entry")                                                          
]                                                                              
insurers = [                                                                   
    entry.text                                                                 
    for entry in tree.find("Branch").find("Insurer").findall("entry")          
]                                                                              

with open("output.csv", "w") as csvfile:                                       
    outputwriter = csvwriter(csvfile)                                            
    outputwriter.writerow(("entry_from_claim", "entry_from_Insurer"))            
    outputwriter.writerows(product(claims, insurers))     

希望这会有所帮助!