Python将XML输出与列表进行比较

时间:2015-10-22 17:27:47

标签: python xml python-2.7

我有一个看起来像这样的XML:

<Import>
  <spId>1234</spId>
  <GroupFlag>false</GroupFlag>
</Import>

我想提取spId的值并将其与列表进行比较,我有以下脚本:

import xml.etree.ElementTree as ET
xml_file = "c:/somefile.xml"

sp_id_list = ['1234']
tree = ET.parse(xml_file)
root = tree.getroot()

for sp_id in root.findall('./spId'):
  if sp_id.text in sp_id_list:
    print sp_id.text

这对spId(数字)不起作用,但适用于将GroupFlag(字符串)与列表进行比较。为什么会发生这种情况?如何解决这个问题?

对于这个愚蠢的问题,我很抱歉,我是这样的人。

1 个答案:

答案 0 :(得分:0)

如果您在此处发布的XML示例是作为输入XML文件提供的,那么您的代码示例可以正常工作。

但是你想要找到所有元素。所以,我假设您的真实文档有很多<Import>个项目。如果某个项目列表未被某个父标记包装,则它不是有效的XML。在这种情况下,您将拥有xml.etree.ElementTree.ParseError

因此,我假设您的真实文档中<Import>不是根元素,而<Import>元素位于文档的更深处,例如

<Parent>
  <Import>
    <spId>1234</spId>
    <GroupFlag>false</GroupFlag>
  </Import>
  <Import>
    <spId>1234</spId>
    <GroupFlag>false</GroupFlag>
  </Import>
</Parent>

在这种情况下,搜索模式'./spId'无法找到这些标记,因为该模式仅匹配根元素的直接子元素。因此,您可以在下方的所有级别使用XPath匹配标记,甚至可以更好地指出从根到spId所在级别的直接路径:

# all subelements, on all levels beneath the current element
root.findall('.//spId')

# all spId elements directly in Import tags that are directly
# beneath the root element (as in the above XML example)
root.findall('./Import/spId'):