解析XCode时无效谓词

时间:2013-07-02 00:47:16

标签: python xpath elementtree

我正在使用ElementTree解析下面显示的xml但使用代码收到错误Invalid Predicate

基本上我正在尝试找到具有特定connect属性名称的元素pin

XML

<deviceset>
<devices>
<device name="">
<connects>
<connect gate="G$1" pin="+15V_DC" pad="7"/>
<connect gate="G$1" pin="FB" pad="3"/>
<connect gate="G$1" pin="ICOM" pad="4"/>
<connect gate="G$1" pin="IN+" pad="5"/>
<connect gate="G$1" pin="IN-" pad="6"/>
<connect gate="G$1" pin="OUT_HI" pad="1"/>
<connect gate="G$1" pin="OUT_LO" pad="9"/>
<connect gate="G$1" pin="PWRCOM" pad="2"/>
</connects>
</device>
</devices>
</deviceset>

PYTHON CODE

  # Imports
    import xml.etree as ET
    from xml.etree.ElementTree import Element, SubElement, Comment, tostring

    # Open a file sent to the function
    file = open(os.path.join(__location__, file));
    tree = ET.parse(file)
    root = tree.getroot()
    deviceset = root.find ('deviceset')
    deviceset.find('devices').find('device').find('connects').**findall("./connect[@pin = \"FB\"]")**

问题似乎是XPATH样式路径(上面突出显示)。

关于我做错了什么的想法?

1 个答案:

答案 0 :(得分:1)

我实际上并不知道问题是什么,因为您没有向我们展示您的实际数据和代码,而您向我们展示的内容甚至无法解决问题。

但我认为这是XPath查询中的额外空格。 @pin = "FB"@pin="FB"不同,并且无法匹配任何内容。

...同时

通常没有理由在Python中显式转义引号。如果要在字符串中使用双引号,只需将字符串括在单引号中,反之亦然。如果你需要两者,通常是三倍(单或双)引号就是答案。

与此同时,我所能做的就是猜测你没有向我们提供有效的XML,也没有为我们提供足以证明问题的有效代码。

  • 没有xml.etree.parse这样的功能。有一个xml.etree.ElementTree.parse,这可能是你想要的。
  • 偶然缩进行意味着在任何事情发生之前你都会获得IndentationError
  • 您的代码不完整 - 它依赖于您从未设置的__location__,以及您从未导入的导入。
  • 代码中间有一个迷路**,会引发SyntaxError
  • XML中的device节点永远不会关闭,因此ET无法解析文件。
  • deviceset节点是根节点,因此root.find('deviceset')将返回None

另外,如果你正在尝试调试一个95个字符长的代码行,你真的应该分解它以找出哪个部分正在破坏,并让你有机会断点或记录输入到部分不起作用。

修复所有这些,然后唯一剩下的问题是你的错误的xpath,所以我假设你的真实代码和数据也是如此,但是没有办法确定。

无论如何,这是固定的XML:

<deviceset>
<devices>
<device name="">
<connects>
<connect gate="G$1" pin="+15V_DC" pad="7"/>
<connect gate="G$1" pin="FB" pad="3"/>
<connect gate="G$1" pin="ICOM" pad="4"/>
<connect gate="G$1" pin="IN+" pad="5"/>
<connect gate="G$1" pin="IN-" pad="6"/>
<connect gate="G$1" pin="OUT_HI" pad="1"/>
<connect gate="G$1" pin="OUT_LO" pad="9"/>
<connect gate="G$1" pin="PWRCOM" pad="2"/>
</connects></device>
</devices>
</deviceset>'''

...和代码:

import os.path
from xml.etree import ElementTree as ET

file = open('foo.xml')
tree = ET.parse(file)
root = tree.getroot()
deviceset = root
connects = deviceset.find('devices').find('device').find('connects')
# Here we could print out stuff about connects to find out what's wrong.
nodes = connects.findall("./connect[@pin='FB']")
print(nodes[0].get('gate'))

运行时,会打印:

G$1