1

私はxmlファイルを解析しています:http://pastebin.com/fw151jQN 私はそれをたくさんコピーして新しいファイルに書きたいと思っています。それは無視しました。最初のパスとして、特定の xml を見つけて、変更せずに新しいファイルに書き込みたいと考えています。

最初に関心のある xml のセクションは次のとおりです。

<COMMAND name="shutdown"
        help="Shutdown the selected interface">
        <CONFIG priority="0x7F01" />
        <ACTION>
        /klas/klish-scripts/interfaces.py conf -i ${iface} --enable 0
        </ACTION>
    </COMMAND>

    <COMMAND name="no shutdown"
        help="Enable the selected interface">
        <CONFIG operation="unset" pattern="shutdown"/>
        <ACTION>
        /klas/klish-scripts/interfaces.py conf -i ${iface} --enable 1
        </ACTION>
    </COMMAND>

私のコードは以下です

#!/usr/bin/python -tt

import xml.etree.ElementTree as ET
tree = ET.parse('interface_range_test.xml')
root = tree.getroot()
namespaces = {'command': 'http://clish.sourceforge.net/XMLSchema}COMMAND','config': 'http://clish.sourceforge.net/XMLSchema}CONFIG'}

all_links = tree.findall('.//')

for i in all_links: 
    if namespaces['command'] in i.tag:
        if i.attrib['name'] == "shutdown":
            print i.attrib       
    if namespaces['config'] in i.tag: 
        print i.attrib

出力:

{'name': 'shutdown', 'help': 'Shutdown the selected interface'}
{'priority': '0x7F01'}
{'pattern': 'shutdown', 'operation': 'unset'}

CONFIGこれはファイルを読み込み、シャットダウン情報を見つけることができます。今、情報を見つけたいのですが、action情報とそれはテキストですが、検索するととCONFIGの両方の情報がshutdownありno shutdownます。このケースは多くの xml で発生し、その多くは同じ形式です。

シャットダウン: {'priority': '0x7F01'} no shutdown: {'pattern': 'shutdown', 'operation': 'unset'}

どちらを参照するかを指定するにはどうすればよいですか?この情報の親を確認できますか? または、その上のスーパー要素の子を確認できますか ( http://clish.sourceforge.net/XMLSchema}COMMAND)?

4

1 に答える 1

2

すべてのコマンドをノード(要素)として検索し、そこから CONFIG 情報を取得できます。

import xml.etree.ElementTree as ET
tree = ET.parse('interface_range_test.xml')
root = tree.getroot()

for command in root.iter("{http://clish.sourceforge.net/XMLSchema}COMMAND"):
    subs = list(command.iter('{http://clish.sourceforge.net/XMLSchema}CONFIG'))
    if len(subs) > 0: #we found CONFIG
        print command.tag, command.attrib, subs[0].tag, subs[0].attrib

そして、あなたは得るでしょう:

{http://clish.sourceforge.net/XMLSchema}COMMAND {'name': 'shutdown', 'help': 'Shutdown the selected interface'} {http://clish.sourceforge.net/XMLSchema}CONFIG {'priority': '0x7F01'}
{http://clish.sourceforge.net/XMLSchema}COMMAND {'name': 'no shutdown', 'help': 'Enable the selected interface'} {http://clish.sourceforge.net/XMLSchema}CONFIG {'pattern': 'shutdown', 'operation': 'unset'}

ところで、大きな xml ファイルを処理する必要がある場合は、lxmlを使用することをお勧めします。これもElementTree と互換性のあるインターフェイスを備えていますが、python の標準的な xml ライブラリよりもはるかに高速です。

于 2013-07-01T15:46:23.940 に答える