将元素的文本内容复制到空兄弟元素

时间:2013-02-11 01:07:30

标签: python xml elementtree

我现在已经使用了ElementTree一段时间了,而且我正在尝试一些没有太大成功的东西。我得到了这个树之王的XML文件:

<root>
   <page>
       <revision>
            <username>Name</>
            <ID>124</>
            <Adress_ip></>
       <revision>
            <username></>
            <ID>125</>
            <Adress_ip>192.168.0.1</>

我想要做的就是将用户名和Adress_ip放在同一个元素中。更确切地说,我正在尝试,当用户名为空时,用Adress_IP中的文本填充它。总有一个在其他值上,而不是在同一个元素中同时存在。

到目前为止,我正在尝试使用这样的代码。问题?这个脚本不想这样做,如果句子,所以lefting lefting空白所有元素没有用户名。当然,这不是我所希望的。

for contributor in tree.iter("revision"):
    for username in contributor.findall('username'):
        vide = username.text.find("")
        if username.text == vide:
            for userip in contributor.findall('ip'):
                revision.set('username', userip.text)
        else:        
            revision.set('username', username.text)

1 个答案:

答案 0 :(得分:0)

  

这个脚本不想这样做,如果句子,那么在没有用户名的情况下删除所有元素。

这一点,

vide = username.text.find("")
if username.text == vide: 
    ...

不起作用;它不会测试username是否为空。只需使用

if username.text == None:
    ...

  

我想要做的就是将用户名和Adress_ip放在同一个元素中。更确切地说,我正在尝试,当用户名为空时,用Adress_IP中的文本填充它。总有一个在其他值上,而不是在同一个元素中同时存在。

输入XML(revisions.xml):

<root>
  <page>
    <revision>
      <username>Name</username>
      <ID>124</ID>
      <Adress_ip></Adress_ip>
    </revision>     
    <revision>
      <username></username>
      <ID>125</ID>
      <Adress_ip>192.168.0.1</Adress_ip>
    </revision>     
  </page>
</root>

Python程序:

from xml.etree import ElementTree as ET

tree = ET.parse("revisions.xml")

for revision in tree.iter("revision"):
    username = revision.find('username')
    Adress_ip = revision.find('Adress_ip')
    if username.text == None:           
        username.text = Adress_ip.text

print ET.tostring(tree.getroot())

输出:

<root>
  <page>
    <revision>
      <username>Name</username>
      <ID>124</ID>
      <Adress_ip />
    </revision>     
    <revision>
      <username>192.168.0.1</username>
      <ID>125</ID>
      <Adress_ip>192.168.0.1</Adress_ip>
    </revision>     
  </page>
</root>