2017-02-18 4 views
0

でXMLを解析中に「タイプ」オブジェクトが属性「__getitem__」を持っていない私は、入力XML下回っていますはTypeError:Pythonの

<?xml version="1.0" ?> 

<host xmlns="urn:jboss:domain:4.1"> 
    <extensions> 
     <extension module="org.jboss.as.jmx"/> 
    </extensions> 
    <management> 
     <security-realms> 
      <security-realm name="ManagementRealm"> 
       <server-identities> 
        <secret value="c2xhdmVfdXNlcl9wYXNzd29yZA=="/> 
       </server-identities> 
      </security-realm> 
     </security-realms> 
    </management> 
</host> 

私はすべての要素を反復処理していますし、サーバ・アイデンティティの要素が見つかったとき、私は以下のように関連付けられている属性を持つ、新しいサブ要素の秘密を追加しようとしています:、

def parse_xml(): 
    tree = ET.parse('sample.xml') 
    root = tree.getroot() 
    for elements in tree.iter(): 
     if "server-identities" in elements.tag: 
      c = ET.Element['secret'] 
      c.attrib['value'] = "some_value" 
      elements.append(c) 

if __name__=="__main__": 
    parse_xml() 

しかしETとして

xml.etreeインポートのElementTreeからラインを

c = ET.Element['secret']

TypeError例外の原因となっている

Traceback (most recent call last): 
    File "parseXml.py", line 16, in <module> 
    parse_xml() 
    File "parseXml.py", line 10, in parse_xml 
    c = ET.Element['secret'] 
TypeError: 'type' object has no attribute '__getitem__' 
  • これはXMLで要素を追加するための正しい方法は何ですか?
  • エラーはなぜ発生しますか?

編集:以下のキースの答えに基づいて解決策が見つかりました。下記のいずれかがそれを達成することができる方法です。

はまず、入力XMLは、あなたがXMLを解析する前にこの名前空間を登録してください、または他のPythonはそれにプレフィックスを追加するグローバル・ネームスペース、

xmlns="urn:jboss:domain:4.1" 

を持っています、XMLコードの

ET.register_namespace('','urn:jboss:domain:4.1') 

レストの構造を変更する以下の通りである:

for elements in tree.iter(): 
    if "server-identities" in elements.tag: 
     c = ET.Element('secret') 
     c.attrib['value'] = "some_value" 
     elements.append(c) 
     tree.write('sample.xml') 

ありがとう

答えて

0

角かっこの構文は、項目アクセサーを呼び出すことを意味します。 Pythonでは、関数呼び出しと同じ構文であるElementクラスを「インスタンス化」する必要があります。かっこを使用します。

c = ET.Element("secret") 
+0

キース、それは働いた。しかし、elements.append(c)はXMLに書き戻しますか? –

+0

もう一度書き留めてください。 – Keith

関連する問題