-1

我正在使用 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>

蟒蛇代码

  # 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 样式路径(上面突出显示)。

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

4

1 回答 1

1

我实际上不知道问题出在哪里,因为您没有向我们展示您的实际数据和代码,而且您向我们展示的内容甚至无法解决问题。

但我认为这是您的 XPath 查询中的额外空格。@pin = "FB"和 不一样@pin="FB",不能匹配任何东西。

同时……</p>

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

同时,我只能猜测的原因是您没有向我们提供有效的 XML 或有效的代码,这些代码足以证明问题。

  • 没有这样的功能xml.etree.parse。有一个xml.etree.ElementTree.parse,这可能是你想要的。
  • 随意缩进行意味着你会IndentationError在任何东西运行之前得到一个。
  • 您的代码不完整——它依赖于__location__您从未设置过的 a,并且您从未导入过 import。
  • **在代码中间有一个会引发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
于 2013-07-02T00:56:19.053 回答