1

私が最近持っていたミニドムの質問が殺到しているのを見たことがあると思います。今週末、私はついに諦めてetreeに移動しました。簡単な質問があります。これをループして、次の形式で出力を取得するにはどうすればよいですか。

名前Class_Nameメンバーの色#fieldy#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>

次のコードは、各名前(私が欲しいもの)の1つの反復を与えます:

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

などなど、私はあなたがアイデアを得ると確信しています。

必要なすべてのデータを収集し、関連する詳細を含む各オブジェクトを独自の行に配置するにはどうすればよいですか?

ありがとうございました!

4

1 に答える 1

1

<Name>との両方<Class_Name>がの子です<network_object>。したがって、を使用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
于 2013-03-25T13:51:03.307 に答える