我正在使用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样式路径(上面突出显示)。
关于我做错了什么的想法?
答案 0 :(得分:1)
我实际上并不知道问题是什么,因为您没有向我们展示您的实际数据和代码,而您向我们展示的内容甚至无法解决问题。
但我认为这是XPath查询中的额外空格。 @pin = "FB"
与@pin="FB"
不同,并且无法匹配任何内容。
...同时
通常没有理由在Python中显式转义引号。如果要在字符串中使用双引号,只需将字符串括在单引号中,反之亦然。如果你需要两者,通常是三倍(单或双)引号就是答案。
与此同时,我所能做的就是猜测你没有向我们提供有效的XML,也没有为我们提供足以证明问题的有效代码。
xml.etree.parse
这样的功能。有一个xml.etree.ElementTree.parse
,这可能是你想要的。IndentationError
。__location__
,以及您从未导入的导入。**
,会引发SyntaxError
。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