2016-04-17 6 views
1

xpathを使用してxmlの要素を検索しようとしています。これは私のコードです:イムfindallを使用している場合、私はこのエラーを得たlxml findall SyntaxError:無効な述語

<?xml version="1.0" encoding="UTF-8"?> 
<model>  
<class name="B" kind="abstract"> 
    <inheritance> 
     <from name="A" privacy="private" /> 
    </inheritance> 
    <private> 
     <methods> 
      <method name="f" type="int" scope="instance"> 
       <from name="A" /> 
       <virtual pure="yes" /> 
       <arguments></arguments> 
      </method> 
     </methods> 
    </private> 
    <public> 
     <attributes> 
      <attribute name="var" type="int" scope="instance"> 
      </attribute> 
     </attributes> 
    </public> 
</class> 
</model> 

raise SyntaxError("invalid predicate") 
SyntaxError: invalid predicate 

私はxpathの代わりfindallを使用しようとしたsomeStringで

utf8_parser = etree.XMLParser(encoding='utf-8') 
root = etree.fromstring(someString.encode('utf-8'), parser=utf8_parser) 

somelist = root.findall("model/class[*/attributes/attribute/@name='var']/@name") 

XMLは次のようになります。スクリプトはエラーなしで実行されますが、somelistは空です。私は間違って何をしていますか?

答えて

1

xpath()からfindall()への切り替えは解決策ではありません。後者は、XPath 1.0式のサブセット(xml.etree.ElementTreeXPath supportと互換性があります)のみをサポートしています。あなたの試行された式はサポートされていないサブセットの一部であることがあります。

実際の問題は、あなたのXPathで再び"model"に言及する必要はありませんので、root変数がすでに、model要素を参照すること、である:それは動作するようになりまし

somelist = root.xpath("class[*/attributes/attribute/@name='var']/@name") 
+0

おかげで、。しかし、xpathからモデルを削除せずにそれを行う方法はありませんか?問題は、xmlがどのように見えるのか分からず、xpathの文字列がどのように見えるかわからないことです。今私は手動でxmlとxpathをチェックし、与えられたxmlに従ってxpathがcorrentであることを知る必要があります。 –

+0

@ T.Syk XPathは正しく動作するようにXMLに対応する必要があります。任意のXMLに対して任意のXPathを動作させる方法はありません。他の人からXMLとXPathを受け取った場合は、XPath/XMLの修正を依頼してください。 – har07

+0

@ T.Syk XPathの "モデル"をどうにかしておきたい場合は、ドキュメント要素を参照する '/'軸を使ってXPathを起動することができます: '/ model/class [*/attributes/attribute/@ name = 'var']/@ name' – har07

関連する問題