0

我现在使用 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 中的文本填充它。总是有另一个价值,永远不会同时在同一个元素中。

到目前为止,我正在尝试一些看起来像这样的代码。问题?该脚本不想在 if 语句中执行此操作,因此将所有没有用户名的元素留空。当然,这不是我所希望的。

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

1 回答 1

0

该脚本不想在 if 语句中执行此操作,因此将所有没有用户名的元素留空。

这一点,

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>

蟒蛇程序:

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>
于 2013-02-13T19:58:19.307 回答