2017-01-23 3 views
0

XML 파일에서 특정 태그의 내용을 추출하려고합니다.elementtree : xml 문서의 특정 태그 내용 가져 오기

샘플 XML :

<facts> 
     <fact> 
      <name>crash</name> 
      <full_name>Crash</full_name> 
      <variables> 
       <variable> 
        <name>id</name> 
        <proper_name>Crash Instance</proper_name> 
        <type>INT</type> 
        <interpretation>key</interpretation> 
       </variable> 
       <variable> 
        <name>accident_key</name> 
        <proper_name>Case Identifier</proper_name> 
        <interpretation>string</interpretation> 
        <type>CHAR(9)</type> 
       </variable> 
       <variable> 
        <name>accident_year</name> 
        <proper_name>Crash Year</proper_name> 
        <interpretation>dim</interpretation> 
        <type>INT</type> 
       </variable> 
      </variables> 
     </fact> 
    <fact> 
     <name>vehicle</name> 
     <full_name>Vehicle</full_name> 
     <variables> 
      <variable> 
       <name>id</name> 
       <proper_name>Vehicle Instance</proper_name> 
       <type>INT</type> 
      </variable> 
      <variable> 
       <name>crash_id</name> 
        <proper_name>Crash Instance</proper_name> 
       <type>INT</type> 
      </variable> 
     </variables> 
    </fact> 
</facts> 

내가 만 크래시 사실, 노드에서 태그의 내용을 모두 끌어합니다.

여기 내 코드가 있습니다.

def header(filename, fact):  
    lst = [] 
    tree = ET.parse(filename) #read in the XML 
    for fact in tree.iter(tag = 'fact'): 
     factname = fact.find('name').text 
     if factname == fact: #choose the fact to pull from 
      for var in fact.iter(tag = 'variable'): 
       name = var.find('name').text 
       lst.append(name) 
    return lst #return a list of all the <name> tags from the Crash fact 

newlst = header('schema.xml','crash') 

내 출력 newlst는 크래시 사실의 모든 태그 목록이어야합니다. 그러나 그것은 계속 비어있게됩니다.

이상하게도, 그것이 내가 하드 코드 모든 경우 올바른 출력을 반환 (및 기능 제거) : 함수에서

lst = [] 
tree = ET.parse('schema.xml') 
for fact in tree.iter(tag = 'fact'): 
    factname = fact.find('name').text 
    if factname == 'crash': 
     for var in fact.iter(tag = 'variable'): 
      name = var.find('name').text 
      lst.append(name) 
print(lst) 


Output: ['id', 
'accident_key', 
'accident_year'] 

답변

3

을, 당신은 매개 변수로 변수 fact을 모두 사용하여, 첫 번째로하고 for 루프 변수입니다. 이 버전을 사용해보십시오 :

def header(filename, target_factname):  
    lst = [] 
    tree = ET.parse(filename) #read in the XML 
    for fact in tree.iter(tag = 'fact'): 
     factname = fact.find('name').text 
     if factname == target_factname: #choose the fact to pull from 
      for var in fact.iter(tag = 'variable'): 
       name = var.find('name').text 
       lst.append(name) 
    return lst #return a list of all the <name> tags from the Crash fact 
+0

나는 바보 같은 실수를하고 있다는 것을 알고있었습니다 ... 감사합니다! – ale19