Python ElementTree.findall返回none

Python ElementTree.findall返回none,python,xml,xpath,Python,Xml,Xpath,我想在xml解析时找到所有密码属性,并将其替换为字符串“password”。为了找到password属性,我尝试了findall(),但它返回“None” Python版本:python2.6 示例代码: from xml.etree.ElementTree import ElementTree tree = ElementTree() a= tree.parse("/home/xxxx/securityfile_test.xml") z = tree.findall(".//password"

我想在xml解析时找到所有密码属性,并将其替换为字符串“password”。为了找到password属性,我尝试了findall(),但它返回“None”

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>

这将拉出所需的元素,更新属性值并转储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提供的唯一版本。如果可以的话,我肯定会建议您升级,但如果您不能升级,我希望这会给您一个正确的方向。

编辑:OP使用的是Python 2.6,这个答案仅对Python 2.7+有效。

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

z = tree.findall(".//*[@password]")
这会奏效的。
*
表示“选择所有元素,[@password]表示“带有密码属性”

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

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

如果我尝试这样做,我会在init raise SyntaxError(“不支持的路径语法(%s)”%op)的第88行得到一个“SyntaxError:invalid substant”异常文件“/usr/lib64/python2.6/xml/etree/ElementPath.py”,SyntaxError:unsupported path syntaxed-syntax(@)抱歉,我没有意识到在那个版本中XPath语法是如此有限。我已经用@jfowkes更新了我的答案,但是像@jfowkes一样,我只能在2.7(确切地说是2.7.12)文件“/usr/lib64/python2.6/xml/etree/ElementPath.py”,第93行的init“预期路径分隔符(%s)”%(op或tag)语法错误:预期路径分隔符([)我相信这只对Python 2.7+有效。