2016-11-03 4 views
0

저는 프로그래밍에 익숙하지 만 일부 파이썬을 알고 있으며 일반적으로 XPath와 XML에 익숙합니다. 현재 내가 이런 식으로 뭔가 보이는 일부 XML 데이터로 일하고 있어요 : 지금이 먼저 속성 값을 찾을 수 있습니다 함께해야 할 일을파이썬 : 하나의 노드에서 여러 속성을 가진 XML 파일 구문 분석하기

<foo> 
    <bar> 
     <unit> 
      <structure> 
       <token word="Rocky" att1="noun" att2="name">Rocky</token> 
       <token word="the" att1="article" att2="">the</token> 
       <token word="yellow" att1="adjective" att2="color">yellow</token> 
       <token word="dog" att1="noun" att2="animal">dog</token> 
      </structure> 
     </unit> 
    </bar> 
</foo> 

을의이 인스턴스에 대한

<token word="dog" att1="noun"att2="animal"</token> 

보자 . 따라서 문서의 모든 구조에서 동물의 모든 노드를 att2 값으로 찾은 다음 해당 노드의 모든 형제를 목록으로 가져 오려고합니다. 노드에는 각각 여러 속성이 있기 때문에 각 목록을 다른 목록에 포함 시키려고합니다. 즉, 동물이 하위 구조 중 하나에있는 구조의 모든 속성에서 목록을 만들려고합니다. att2 값. 예를 들면 다음과 같습니다.

listWord = [Rocky, the, yellow, dog] 
listAtt1 = [noun, article, adjective, noun] 
listAtt2 = [name, ,color, animal] 

현재로서는 가능한지 궁금합니다. 지금까지 나는 빈 값은 말할 것도없고 속성 구조로 벽에 머리를 때렸다. 닫는 토큰 태그와

+0

귀하의 XML, 그것은 몇 폐쇄 유효 그리워되지는> – Guillaume

+0

XML 구조가 깨졌습니다. 모든 ''태그에 '>'가 없습니다. 아마도 복사 및 붙여 넣기 오류입니다. – Marcs

+0

그런 다음 해당 노드의 모든 형제를 목록으로 가져옵니다. => 정확히 형제 란 무엇이라고 부릅니까? – Guillaume

답변

0

이 포함되어 있으며, 텍스트를 가정하면 test.xml에 포함되면, 다음 :

import xml.etree.ElementTree 

e = xml.etree.ElementTree.parse('test.xml').getroot() 

listWord = [] 
listAtt1 = [] 
listAtt2 = [] 

for child in e.iter('token'): 
    listWord.append(child.attrib['word']) 
    listAtt1.append(child.attrib['att1']) 
    listAtt2.append(child.attrib['att2']) 

print listWord 
print listAtt1 
print listAtt2 

가 반환합니다

['Rocky', 'the', 'yellow', 'dog'] 
['noun', 'article', 'adjective', 'noun'] 
['name', '', 'color', 'animal'] 

e.iter() 당신이 루트로 e 및 반복 할 수 있습니다 그 아래의 요소 - token의 태그를 지정하면 token 요소 만 반환됩니다. child.attrib은 목록에 추가하는 특성 사전을 반환합니다.

편집 :

import xml.etree.ElementTree 

e = xml.etree.ElementTree.parse('test.xml').getroot() 

listWord = [] 
listAtt1 = [] 
listAtt2 = [] 
animal_structs =[] 

for structure in e.iter('structure'): 
    for child in structure.iter('token'): 
     if 'att2' in child.keys(): 
      if child.attrib['att2'] == 'animal': 
       animal_structs.append(structure) 
       break 

for structure in animal_structs: 
    for child in structure.iter('token'): 
     listWord.append(child.attrib['word']) 
     listAtt1.append(child.attrib['att1']) 
     listAtt2.append(child.attrib['att2']) 

print listWord 
print listAtt1 
print listAtt2 

우리는 먼저 모든 structure 요소의 목록을 작성 : 질문의 두 번째 비트, 나는 다음이 당신을 위해 무엇을 찾고있는 않는다 (잠재적없는 가장 좋은 방법은 아니지만) 생각 animal 하위를 사용하여 각 해당 구조의 모든 특성을 반환합니다.

+0

이것은 매우 유망 해 보이지만 여전히 내가 얻는 것은 : 아이라면.attrib [ 'att2'] == 'animal': KeyError : 'att2' – Ize

+0

토큰에이 키가 있는지 확인해야합니다. 편집했습니다. – asongtoruin

+0

정확합니다. 이것은 짧은 XML 추출로 테스트 할 때 완벽하게 작동하지만 원본 XML 파일로는 그다지 효과가 없습니다. 그 중 하나가 틀린 것이 틀림 없습니다. – Ize

0

내가 당신의 질문을 이해 모르겠지만, 여기에 내가 (LXML와 XPath를 사용하여) 이해 부분입니다 : 토큰에 대한

from lxml import etree 
tree = etree.fromstring("""<foo> 
    <bar> 
     <unit> 
      <structure> 
       <token word="Rocky" att1="noun" att2="name"></token> 
       <token word="the" att1="article" att2=""></token> 
       <token word="yellow" att1="adjective" att2="color"></token> 
       <token word="dog" att1="noun" att2="animal"></token> 
      </structure> 
     </unit> 
    </bar> 
</foo>""") 


// get a list of all possible words, att1, att2: 
listWord = tree.xpath("//token/@word") 
listAtt1 = tree.xpath("//token/@att1") 
listAtt2 = tree.xpath("//token/@att2") 

// get all the tokens with att2="animal" 
for token in tree.xpath('//token[@att2="animal"]'): 
    do_your_own_stuff()