繁体   English   中英

python xml 解析跳过子元素并仅打印子元素下的元素

[英]python xml parsing skip child element and print only the elements under the child

豌豆帮助。 从下面的 XML 片段中,我想打印标签 P 下的所有子节点(递归) 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>

我的代码能够打印以下内容。 但是我想跳过 <C_PM_C> 并仅打印带有值的元素。 我如何做到这一点?

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])

尝试这个。

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM