2017-08-01 10 views
0

私はminidomを使用してデバッグキーリストのリストを含むXMLを検査しています。 XMLの例は以下の通りである。Pythonでは、XMLの特定のセクションを調べてノードテキストを抽出するにはどうすればよいですか?

<Shortcuts> 
    <Item> 
    <CommandName>DebugCommandName_1</CommandName> 
    <ShortcutKeys> 
     <Item> 
     <Keys> 
      <Item>KEY_1</Item> 
      <Item>KEY_2</Item> 
     </Keys> 
     </Item> 
    </ShortcutKeys> 
    </Item> 
... 
    <Item> 
    <CommandName>DebugCommandName_2</CommandName> 
    <ShortcutKeys> 
     <Item> 
     <Keys> 
      <Item>KEY_3</Item> 
     </Keys> 
     </Item> 
     <Item> 
     <Keys> 
      <Item>KEY_4</Item> 
     </Keys> 
     </Item> 
    </ShortcutKeys> 
    </Item> 
</Shortcuts> 

を私のコントロールを超えた理由から、私が入ってくるXMLの形式を要求することはできませんがより一貫性を持つように変更されているので、私は両方のレイアウトを考慮しなければなりません文書のShortcutKeysセクション、および複数のItem子要素をその場全体に表示することができます。 minidomとXMLを解析

、私はその後、コンテンツを抽出するために、次のPythonを使用します。

for item in parsedKeyComboFile.getElementsByTagName("Item"): 
if (item.getElementsByTagName("CommandName").length > 0): 
    commandName = item.getElementsByTagName("CommandName")[0].childNodes[0].nodeValue 
    print(commandName) 
elif (item.getElementsByTagName("Keys").length > 0): 
    keyCombo = item.getElementsByTagName("Item")[0].childNodes[0].nodeValue 
    print(keyCombo) 

私は最終的に辞書にこの情報を追加することが、私が得る上でXMLのうち、今印刷用されます次のとおりです。

DebugCommandName_1 
KEY_1 
DebugCommandName_2 
KEY_3 
KEY_4 

私が望むことはあるとき:

DebugCommandName_1 
KEY_1 KEY_2 
DebugCommandName_2 
KEY_3 KEY_4 

(私は私はありません実現単一行出力を達成するためにキーの印刷を適切にフォーマットする。ここで重要なのはKEY_2項目をスキップしていないことです)。

私はkeyCombo =行の[0]がキーのItemの最初の出現を制限していることを知っています。

トップレベルのItemとそのすべての子要素を検査し、その最上位のItem内の単一のCommandNameとすべてのキーアイテムを引き出し、次にその次のトップに移動する方法がありますかレベルアイテムとプロセスを繰り返す?私は今までこれを達成できていませんでした。

ElementTreeを使用する必要がありますか?

多くのありがとうございます。私は、私は答えとしてこれを中に置くために私を許してくださいしきい値を下回っていますと、コメントすることができません

答えて

1

私はminidomとは経験をしたん、と勧告で

それは使用が推奨されていないです、あなたはおそらくしたいです代わりにxml.etree.ElementTreeを使用してください。

- あなたの代わりにxml.etree.ElementTreeを使用することができる場合、これは簡単な方法かもしれ

minidomタグ情報から:

import xml.etree.ElementTree as ET 
tree = ET.parse('example.xml') 
root = tree.getroot() # unused variable in this example 

for elem in tree.iter(): 
    if elem.tag == 'CommandName': 
     print(elem.text) 
    if elem.tag == 'Keys': 
     for item in elem: 
      print(item.text) 

プリント

DebugCommandName_1 
KEY_1 
KEY_2 
DebugCommandName_2 
KEY_3 
KEY_4 

それともあなたが望むならば各<Keys>タグのリスト:

枚の
if elem.tag == 'Keys': 
    print([item.text for item in elem]) 

プリント:

DebugCommandName_1 
['KEY_1', 'KEY_2'] 
DebugCommandName_2 
['KEY_3'] 
['KEY_4'] 
+0

優秀な、と私は明らかにminidomドキュメントに見逃していたものを指摘ありがとうございました! –

関連する問題