2017-02-18 75 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