ElementTree.findall返回none

时间:2018-05-23 13:22:51

标签: python xml xpath

我希望在xml解析时找到所有密码属性,并用字符串“password”替换它。要查找密码属性,我尝试了findall(),但它返回“无”。

Python版本:python2.6

示例代码:

from xml.etree.ElementTree import ElementTree
tree = ElementTree()
a= tree.parse("/home/xxxx/securityfile_test.xml")
z = tree.findall(".//password")
print z

任何人都可以帮忙

示例xml

<?xml version="1.0" encoding="UTF-8"?>
<security xmlns="http:xxxxx">

  <group name="Abc" description="xxxxx.">
    <rMember ref="A"/>
  </group>
  <user name="yyyy" password="**####***">
    <gMember ref="A"/>
  </user>
  <group name="oooo" description="XXXXx">
    <rMember ref="O"/>
  </group>
   <user name="zzzz" password="****###***">
    <gMember ref="A"/>
  </user>
  </security>

2 个答案:

答案 0 :(得分:0)

这将提取您需要的元素,更新属性值并转储xml结果:

import xml.etree.ElementTree as Etree
tree = Etree.parse("file.xml")
root = tree.getroot()
print(root)
z = root.findall(".//*[@password]")
for elm in z:
    elm.attrib['password'] = "Password"
    print(Etree.dump(root))

我只能在2.7.12上测试,因为它是我对python2唯一的版本。如果可以的话,我肯定会建议你升级,但是如果你不能的话,这应该会给你一个正确的方向。

答案 1 :(得分:0)

编辑:OP正在使用Python 2.6,这个答案仅适用于Python 2.7 +

请参阅elementtree documentation

要根据属性选择元素,您需要使用不同的语法。如果您使用:

z = tree.findall(".//*[@password]")

这会奏效。 *表示“选择所有元素”,[@ password]表示“使用密码属性”。

使用Python 2.7.12在XML文件上生成结果:

[<Element '{http:xxxxx}user' at 0x585ad30>, <Element '{http:xxxxx}user' at 0x585ae48>]