2017-02-18 62 views
0

我有輸入XML以下:類型錯誤:「類型」對象沒有屬性「__getitem__」在Python而解析XML

<?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> 

我遍歷所有元素和當服務器標識元件被發現,我我試圖添加一個新的子元素的祕密,有如下的相關屬性:作爲ET從xml.etree進口ElementTree的

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() 

然而,行

c = ET.Element['secret']

導致類型錯誤

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有一個全局命名空間,

xmlns="urn:jboss:domain:4.1" 

因此,請確保您解析XML之前註冊這個命名空間,否則Python將添加一個前綴它,這改變了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

方括號語法意味着調用項存取器。你想「實例化」Element類,它在Python中與函數調用的語法相同。使用括號。

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

基思,它的工作。但是將elements.append(c)寫回到XML中? –

+0

你必須重新寫出來。 – Keith

相關問題