请帮忙。从下面的 XML 片段中,我想打印标签 P 下的所有子节点(递归) [注意:我在一个具有相似结构的循环中解析多个 xml,并将值存储在列表字典中,稍后以 csv 格式打印]
<B>
<C>
<A>
<P>
<H-t>Enabled</H-t>
<E_D_B>Enabled</E_D_B>
<H_P>Enabled</H_P>
<A_C_L_P>Enabled</A_C_L_P>
<D_S_P>Enabled</D_S_P>
<D_I_P>Enabled</D_I_P>
<I_V_T>Enabled</I_V_T>
<C_PM_C>
<P_T>Efficient</P_T>
<I_S>Disabled</I_S>
<E_P>Balanced</E_P>
</C_PM_C>
</P>
</A>
</C>
</B>
我的代码能够打印以下内容。但是我想跳过
Parameter server1 server2 server3
------------------------------------------------
E_D_B Disabled Disabled Disabled
H-t Enabled Enabled Enabled
A_C_L_P Enabled Enabled Enabled
D_S_P Enabled Enabled Enabled
D_I_P Enabled Enabled Enabled
I_V_T Enabled Enabled Enabled
C_PM_C
这是我的代码
import os,sys
import xml.etree.ElementTree as ET
import csv
import glob
import re
host = input("Enter the host name: ")
files = [os.path.basename(x) for x in glob.glob('C:/Users/config-'+host+'*.xml')]
bios_dict = {}
header_dict ={}
count = 0
header_dict['Parameter'] = [None] * len(files)
for file in files:
m = re.match( r'config-(.*)-\d+-\d+-\d+.xml',file)
header_dict['Parameter'][count] = m.group(1)
tree = ET.parse('C:/Users/'+file)
root = tree.getroot()
for t in root.findall('.//P/*'):
if t.tag not in bios_dict:
bios_dict[t.tag]= [None] * len(files)
bios_dict[t.tag][count] = t.text
count = count + 1
for k, v in bios_dict.items():
print("{}={}".format(k,v))
with open("bios_dict1.csv", "w") as f_output:
csv_output = csv.writer(f_output)
for hkey in header_dict.keys():
csv_output.writerow([hkey] + header_dict[hkey])
for key in sorted(bios_dict.keys()):
csv_output.writerow([key] + bios_dict[key])
答案 0 :(得分:0)
试试这个。
from simplified_scrapy import SimplifiedDoc, utils
def setItem(item, ele):
p_children = ele.children
if not p_children:
item[ele.tag] = ele.text
return
for i in p_children:
setItem(item, i)
items = []
path = 'xmlpath/'
files = utils.getSubFile(path, end='.xml')
for f in files:
item = {}
doc = SimplifiedDoc(utils.getFileContent(f))
setItem(item, doc.select('P'))
items.append(item)
rows = []
for h in items[0].keys():
row = [h]
for i in items:
row.append(i[h])
rows.append(row)
utils.save2csv('test.csv', rows)