-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 で引用符を明示的にエスケープする正当な理由はありません。文字列内で二重引用符を使用する場合は、文字列を一重引用符で囲みます。両方が必要な場合は、多くの場合、3 重 (一重または二重) 引用符が答えになります。

それまでの間、私にできることは推測ですが、問題を実証するのに十分な有効な XML または有効なコードが提供されていないためです。

  • などの機能はありませんxml.etree.parse。がありxml.etree.ElementTree.parse、これはおそらくあなたが望んでいたものです。
  • 無計画に行をインデントするということは、IndentationError何かを実行する前に を取得することを意味します。
  • あなたのコードは不完全です — それはあなたが設定したことのない a に依存しており、__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
于 2013-07-02T00:56:19.053 に答える