如何使用Python查找Microsoft自动生成的XML文件中的元素?
如何使用Python查找Microsoft自动生成的XML文件中的元素?
我太懂你这种挫败感了——明明XML里清清楚楚躺着failcount这些元素,用findtext却返回None,简直摸不着头脑!其实问题的核心就是XML命名空间在搞怪,PowerShell序列化的XML默认带了专属命名空间,ElementTree不会自动识别它,直接用标签名查找肯定找不到。
来,我给你一步步解决这个问题:
1. 先搞清楚命名空间的问题
你看你提供的XML开头有这么一行:
<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
这里的xmlns就是命名空间声明,意味着所有元素都属于http://schemas.microsoft.com/powershell/2004/04这个命名空间,ElementTree查找元素时必须带上这个命名空间才能定位到。
2. 编写正确的解析代码
我们可以给这个长命名空间起个短别名(比如ps),然后用带命名空间的XPath来查找元素。直接上完整代码:
import xml.etree.ElementTree as ET # 定义命名空间映射,把PowerShell的命名空间简化成ps ns_map = {'ps': 'http://schemas.microsoft.com/powershell/2004/04'} # 解析XML文件(注意路径用r前缀避免转义问题) tree = ET.parse(r'd:\tmp\myxml.file') root = tree.getroot() # 获取failcount的值 failcount_element = root.find('.//ps:I32[@N="failcount"]', ns_map) failcount = failcount_element.text if failcount_element else "未找到该元素" print(f"failcount: {failcount}") # 获取lastSuccessDT的时间值 last_success_element = root.find('.//ps:Obj[@N="lastSuccessDT"]/ps:DT', ns_map) last_success_dt = last_success_element.text if last_success_element else "未找到该元素" print(f"lastSuccessDT: {last_success_dt}") # 获取lastFailureDT的时间值 last_failure_element = root.find('.//ps:Obj[@N="lastFailureDT"]/ps:DT', ns_map) last_failure_dt = last_failure_element.text if last_failure_element else "未找到该元素" print(f"lastFailureDT: {last_failure_dt}")
代码里的关键细节解释
ns_map:把冗长的命名空间URI映射成短别名ps,这样写XPath的时候更简洁。.//ps:I32[@N="failcount"]:这个XPath的意思是:从根节点开始,查找所有后代中带有N="failcount"属性的I32元素(注意前面要加命名空间别名ps:)。.//ps:Obj[@N="lastSuccessDT"]/ps:DT:先找到属性N="lastSuccessDT"的Obj元素,再取它下面的DT子元素,这样就能拿到时间字符串了。- 加了
if ... else判断是为了避免元素不存在时抛出异常,让代码更健壮。
额外小技巧
如果你不确定命名空间URI是什么,可以通过打印根节点的标签来查看:
print(root.tag) # 输出会是 {http://schemas.microsoft.com/powershell/2004/04}Objs # 大括号里的内容就是命名空间URI
这样运行代码后,你就能顺利拿到想要的三个值啦!
备注:内容来源于stack exchange,提问作者J. Diefenbaker
相关产品推荐
相关产品推荐

