Python 使用 etree 循环

标签 python xml loops

我相信你们中的许多人都已经看到我最近遇到的大量迷你领域问题。这个周末,我终于放弃并转向 etree,并有一个简单的问题:我应该如何循环它以提供以下格式的输出:

名称 Class_Name 成员颜色 #field y #field z

XML 示例(有许多不同类型的 Class_Name):

<network_objects>
<network_object>
<Name>Test_Group_A</Name>
<Class_Name>network_object_group</Class_Name>
<members>
  <reference>
    <Name>Host1</Name>
    <Table>network_objects</Table>
  </reference>
  <reference>
    <Name>Host2</Name>
    <Table>network_objects</Table>
  </reference>
  <reference>
    <Name>Host3</Name>
    <Table>network_objects</Table>
  </reference>
  <reference>
    <Name>Host4</Name>
    <Table>network_objects</Table>
  </reference>
  <reference>
    <Name>Host5</Name>
    <Table>network_objects</Table>
  </reference>
  <reference>
    <Name>Host6</Name>
    <Table>network_objects</Table>
  </reference>
  <reference>
    <Name>Host7</Name>
    <Table>network_objects</Table>
  </reference>
</members>
<color><![CDATA[deep pink]]></color>
<comments><![CDATA[no comment]]></comments>
<group_convention_query><![CDATA[]]></group_convention_query>
<group_sort_type>3</group_sort_type>
<is_convention_on>false</is_convention_on>
<member_class><![CDATA[network_object]]></member_class>
<members_query><![CDATA[]]></members_query>
<type><![CDATA[group]]></type>
  </network_object>
 </network_objects>

以下代码为我提供了每个名称的一次迭代(我想要的):

for Name in tree.iterfind('network_object/Name'):
    print (Name.text)

但是,如果我在 for 循环中执行 for 循环,我会得到所有名称的输出,以及 Class_Name 的所有变体(与实际情况相比)。例如:

for Name in tree.iterfind('network_object/Name'):
    for Class_name in tree.iterfind('network_object/Class_Name'):
          print (Name.text,Class_name.text)

DB_Servers host_plain
DB_Servers network_object_group
DB_Servers dynamic_object

等等等等,我相信你明白了。

我将如何收集我需要的所有数据,然后将每个对象及其相关详细信息放在自己的行上?

谢谢!

最佳答案

两者都是<Name><Class_Name><network_object>的 child 。所以你可以使用iterfind找到所有<network_objects> ,然后使用find查找单<Name><Class_Name>子元素:

<小时/>

例如,使用此设置:

import xml.etree.ElementTree as ET

content='''<network_objects>
<network_object>
<Name>Test_Group_A</Name>
<Class_Name>network_object_group</Class_Name>
<members>
  <reference>
    <Name>Host1</Name>
    <Table>network_objects</Table>
  </reference>
  <reference>
    <Name>Host2</Name>
    <Table>network_objects</Table>
  </reference>
  <reference>
    <Name>Host3</Name>
    <Table>network_objects</Table>
  </reference>
  <reference>
    <Name>Host4</Name>
    <Table>network_objects</Table>
  </reference>
  <reference>
    <Name>Host5</Name>
    <Table>network_objects</Table>
  </reference>
  <reference>
    <Name>Host6</Name>
    <Table>network_objects</Table>
  </reference>
</members>
</network_object>
</network_objects>  
'''

代码

root = ET.fromstring(content)
for network in root.iterfind('network_object'):
    name = network.find('Name')
    class_name = network.find('Class_Name')
    print (name.text,class_name.text)
    for subname in network.iterfind('members/reference/Name'):
        print(subname.text)

产量

('Test_Group_A', 'network_object_group')
Host1
Host2
Host3
Host4
Host5
Host6

关于Python 使用 etree 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15616471/

相关文章:

python - 用 `requests`判断域名是否被注册是否准确?

loops - 可能的循环不变式

java - 如何暂时打破 if 链.. do ...循环?

java - Spring 没有为每个 session 初始化一个对象

javascript - 使用 JavaScript 从 XML 节点检索内部文本时遇到问题

c - 仅循环外的段错误

java - 在 jython 中使用 mapi 发送邮件

python - 相互包含的高效字符串

javascript - 从 javascript 调用 python 脚本

php - DOMDocument::loadXML 与 HTML 实体