2016-06-21 13 views
0

申し訳ありません。 私はこの(私が怒鳴る二つのブロックでそれを分割させ、適切に私のコードをフォーマットすることができませんでした)があります。XPath式で何が問題になっています

xpath_expr = "//{configData.xsd}bulkCmConfigDataFile/{utranNrm.xsd}UtranCell" 
ucells = tree.xpath(xpath_expr) 

を行うが、エラーエン取得しようとして

<?xml version="1.0" encoding="UTF-8"?> 
<bulkCmConfigDataFile xmlns:es="EricssonSpecificAttributes.14.04.xsd" 
    xmlns:un="utranNrm.xsd" xmlns:xn="genericNrm.xsd" 
    xmlns:gn="geranNrm.xsd" xmlns="configData.xsd"> 
    <fileHeader fileFormatVersion="32.615 V4.5" vendorName="Ericsson"/> 
    <un:UtranCell id="U1"> 
     <un:attributes> 
     <un:localCellId>1</un:localCellId> 
     <un:uarfcnUl>9886</un:uarfcnUl> 
     <un:uarfcnDl>10836</un:uarfcnDl> 
     <un:primaryScramblingCode>335</un:primaryScramblingCode> 
     <un:primaryCpichPower>300</un:primaryCpichPower> 
     <un:maximumTransmissionPower>400</un:maximumTransmissionPower> 
     <un:primarySchPower>-18</un:primarySchPower> 
     <un:cId>1</un:cId> 
     <un:userLabel>U_TST33_1</un:userLabel> 
     <un:secondarySchPower>-35</un:secondarySchPower> 
     <un:bchPower>-31</un:bchPower> 
     <un:lac>65006</un:lac> 
     <un:rac>6</un:rac> 
     <un:sac>1</un:sac> 
     <un:uraList>65006</un:uraList> 
     </un:attributes> 
    </un:UtranCell> 
    <fileFooter dateTime="2016-04-13T15:11:31Z"/> 
</bulkCmConfigDataFile> 

I`m:

File "lxml.etree.pyx", line 2186, in lxml.etree._ElementTree.xpath (src\lxml\lxml.etree.c:60010) 
File "xpath.pxi", line 359, in lxml.etree.XPathDocumentEvaluator.__call__ (src\lxml\lxml.etree.c:152734) 
File "xpath.pxi", line 227, in lxml.etree._XPathEvaluatorBase._handle_result (src\lxml\lxml.etree.c:151097) 
File "xpath.pxi", line 213, in lxml.etree._XPathEvaluatorBase._raise_eval_error (src\lxml\lxml.etree.c:150950) 

lxml.etree.XPathEvalError:無効な表現

私がやって何が悪いのか? XPathがこれに関連して書き込まなければならないので

- Root tag: {configData.xsd}bulkCmConfigDataFile 
- Child tags: {utranNrm.xsd}UtranCell {'id': 'U1'} 
+0

これは 'lxml.etree'ですか?標準ライブラリElementTree?他に何か? –

+0

はい、lml.etree:tree = etree.parse(infile) root = tree.getroot() –

答えて

0

変数「ルート」のXMLコンテキストが既に< bulkCmConfigDataFileに位置している>ノードこの

tree = etree.parse(infile) 
root = tree.getroot() 
print 'Root tag: ', root.tag 
for child_of_root in root: 
     print 'Child tags: ', child_of_root.tag, child_of_root.attrib 

を実行ところで は、この出力を与えますノード。

例えば、個人的に

ucells = root.findall("un:UtranCell", namespaces={'un':'utranNrm.xsd'}) 

または

ucells = root.findall("{utranNrm.xsd}UtranCell") 

名前空間がXPathには、はるかに読みやすくなり、一度、最終的に定義することができるので、私は、最初のオプションを好みます。あなたが持っていたことが唯一の1 UtranCellがある知っている場合

は、これは返すために)(root.findを使用し、あなたがして

また
for cell in ucells: 
    print cell.get('id') 

で反復可能要素のリストを返します。単一要素。

+0

パーフェクト!しかし、ソースファイルは私にとっては知られていません。これは、1つ以上の細胞からなることができる。さらに、各セルは1つ以上の子グループを持つことができ、各グループは1つ以上のサブファイルなどを持つことができます。したがって、tree.xpathを使用してucellのリストだけでなくオリジナル構造を作成すると便利です。それは元の構造(ノード/子/サブファイル/ child_of_subchild/etc。)のすべての要素を調べることができないようですroot.findallを使用して、それはありませんか? –

+0

これは、bulkCmConfigDataFileのすぐ下にあるUtranCellノードを取得するだけです。子ノードは考慮されません。すべての子ノードをucells内の単一リストとして含める場合は、xpathを ".//un:UtranCell"に置き換えます。それらはドキュメントの順序でリストされます。または、親ウィルがXMLツリーをたどるようにする必要がある場合は、cell.findall( "un:UtranCell" ...)を使用して、すべての子を再帰的にループします。 –

+0

お返事ありがとうございました。私は親を追跡したいしかし、私の場合のxpathはどうですか?私は、表現に欠けている単純なものがあると思います。そういうわけではありませんか? –

関連する問題