2017-07-21 14 views
1

xmlモジュールを使用してxmlファイルを解析する必要があります。このXMLファイルには複数のタグがあり、タグの中にはサブタグがあります。以下に示すようにxmlファイルは次のとおりです。私は上記のファイルを解析したいPythonでxmlモジュールを使用してxmlファイルを解析する

file.xml

<?xml version="1.0" encoding="UTF-8"?> 
<testsuites> 
    <testsuite name="ObjectGenerator_DEBUG"> 
     <properties> 
      <property name="id" value="9" /> 
      <property name="short_description" value="" /> 
      <property name="requirements" value="" /> 
      <property name="build_nr" value="2571" /> 
     </properties> 
     <testcase classname="DEBUG" name="Test object creation" > 
      <error message="failed" type="Error"/> 
     </testcase> 
     <testcase classname="DEBUG" name="Init Test" /> 
     <testcase classname="DEBUG" name="Init Test2" /> 
    </testsuite> 
</testsuites> 

。私は "testcase"という名前のタグとその属性 "classname"と "name"を解析するだけです。また、解析中に、testcaseタグに "error"サブタグがあるかどうかを知りたいと思います。どうすればそれを達成できますか?私はタグのみをテストケースが、サブタグはエラーではありません見つけることができる午前

my_script.py

def parse_xmlfile(file_path): 
    tree = ET.parse(file_path) 
    root = tree.getroot() 
    for elem in tree.iterfind('testsuite/testcase'):// or for elem in root.iter('testcase'): 
     print (elem.tag, elem.attrib) 

以下のように私の実装が見えます。どうすればこれを達成できますか?サブタグが存在するかどうかにかかわらず、すべてのテストケースタグでチェックする可能性はありますか?両方の可能性を試しましたが、動作しません。あなたがして試すことができますあなたの

答えて

0

を、次のアプローチを使用します。

... 
for elem in tree.iterfind('testsuite/testcase'): 
    childs = list(elem) # getting child nodes 
    # check if `error` node exists among `testcase` child nodes 
    has_error = any(n.tag == 'error' for n in childs) 
    print (elem.tag, elem.attrib, ', has error: ', has_error) 

出力:

testcase {'name': 'Test object creation', 'classname': 'DEBUG'} , has error: True 
testcase {'name': 'Init Test', 'classname': 'DEBUG'} , has error: False 
testcase {'name': 'Init Test2', 'classname': 'DEBUG'} , has error: False 
0

ありがとう:

import xml.etree.ElementTree as ET 
tree = ET.parse('test.xml') 
root = tree.getroot() 
for testcase in root.iter('testcase'): # loop all testcase elements 
    testcase_att = testcase.attrib # get attribute of each element 
    print(testcase_att) 
    if testcase.find('error') is not None: # check if the element has error or not 
     print("YES") 

それを印刷します:

{'classname': 'DEBUG', 'name': 'Test object creation'} 
YES 
{'classname': 'DEBUG', 'name': 'Init Test'} 
{'classname': 'DEBUG', 'name': 'Init Test2'} 
関連する問題