我们如何在python中的xml中找到特定节点,同时检查其树结构?

问题描述 投票:0回答:1

我的xml是

<?xml version="1.0" encoding="UTF-8"?>
<ServiceResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://xx.xx.xx/xx/xx/x.x/xx/xx.xsd">
  <responseCode>SUCCESS</responseCode>
  <count>100</count>
  <hasMoreRecords>true</hasMoreRecords>
  <lastId>12345</lastId>
  <data>
    <Main>
      <sub1>1</id>
      <sub2>a</name>
    </Main>
    <Main>
      <sub1>2</id>
      <sub2>b</name>
    </Main>
  </data>
</ServiceResponse>

我的代码是:

import csv
import xml.etree.ElementTree as etree

xml_file_name = 'blah.xml'
csv_file_name = 'blah.csv'
main_tag_name = 'Main'
fields = ['sub1', 'sub2']

tree = etree.parse(xml_file_name)

with open(csv_file_name, 'w', newline='', encoding="utf-8") as csv_file:
    csvwriter = csv.writer(csv_file)
    csvwriter.writerow(fields)
    for host in tree.iter(tag=main_tag_name):
        data = []
        for field in fields:
            if host.find(field) is not None:
                data.append(host.find(field).text)
            else:
                data.append('')
        csvwriter.writerow(data)

以某种方式,我认为这不是解析xml的正确方法,因为它正在树结构中的任何位置搜索“ Main”,并且没有遵循特定的路径进行搜索。含义-如果它在其他任何地方意外找到了“ Main”,则该程序将无法正常运行。

[请您为我提供关于此用例的最优化的方法,主要是一种内置方法,而不是过多的定制。

注意-我想将此文件用作多个xml文件的通用脚本,这些文件在到达主标签之前具有各种标签,然后又具有各种子标签。需要考虑这一点,以确保我们不对树结构进行硬编码并且是可配置的。

python python-3.x xml xml-parsing
1个回答
0
投票

您可以尝试基于xpath的方法。

例如:

with open('some.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    with open("test.xml") as f:
        tree = ET.parse(f)
        root = tree.getroot()
        sub1_nodes = root.findall('.//data/Main/sub1')
        sub2_nodes = root.findall('.//data/Main/sub2')
        for a,b in zip(sub1_nodes, sub2_nodes):
            writer.writerow([a.text, b.text])
© www.soinside.com 2019 - 2024. All rights reserved.