2017-03-29 25 views
6

Bir XML dosyası var:XML elementtree indeksleme etiketleri

<sentence id="en_BlueRibbonSushi_478218345:2"> 
    <text>It has great sushi and even better service.</text> 
</sentence> 
<sentence id="en_BlueRibbonSushi_478218345:3"> 
    <text>The entire staff was extremely accomodating and tended to my every need.</text> 
</sentence> 
<sentence id="en_BlueRibbonSushi_478218345:4"> 
    <text>I&apos;ve been to this restaurant over a dozen times with no complaints to date.</text> 
</sentence> 

XML elementtree kullanarak, bir etiket bir öznitelik category= sahiptir <Opinion> eklemek istiyorum. Ben karakter list = ['a', 'b', 'c'] bir listesi var ki, bu yüzden var mümkün adım adım her metne onları asign şudur:

<sentence id="en_BlueRibbonSushi_478218345:2"> 
    <text>It has great sushi and even better service.</text> 
    <Opinion category='a' /> 
</sentence> 
<sentence id="en_BlueRibbonSushi_478218345:3"> 
    <text>The entire staff was extremely accomodating and tended to my every need.</text> 
    <Opinion category='b' /> 
</sentence> 
<sentence id="en_BlueRibbonSushi_478218345:4"> 
    <text>I&apos;ve been to this restaurant over a dozen times with no complaints to date.</text> 
    <Opinion category='c' /> 
</sentence> 

ben cümle id özelliğini kullanabilirsiniz farkındayım ama bu yeniden yapılandırılması bir sürü gerektirecektir benim kodu. Temel olarak, her bir cümle girişini liste dizinim ile hizalamak için dizine ekleyebilmeyi isterdim.

+2

Nitelikler bir sözlük gibidir: XML verilerini varsayarsak bu belge ağacına öğe ekleyecek, data adında bir değişken bulunmaktadır. Sözlük siparişinin herhangi bir şekilde korunacağı garanti edilmez. – leovp

+0

Oh Görüyorum. Doğrulayıcı ile birlikte çalışır (altın standart olarak kontrol edilir) ve değiştirmeye gerek yoktur. Teşekkürler! – user3058703

+0

Tekrarlanabilir bir örnek yapabilir misiniz? – kilojoules

cevap

4

Ağaca öğe eklemek için SubElement fabrika işlevini kullanabilirsiniz.

import xml.etree.ElementTree as ET 
tree = ET.XML(data) 
for elem, category in zip(tree.findall('sentence'), ['a', 'b', 'c']): 
    Opinion = ET.SubElement(elem, 'Opinion') 
    Opinion.set('category', category) 

ET.dump(tree) # prints the tree; tree.write('output.xml') is another option 
+1

'zip', en kısa yinelenen geçişi bittiğinde duracaktır, bu nedenle önerdiğiniz dilimleme gerekli değildir (çünkü herhangi bir fark yaratmayacaktır). Her halükarda, OP'nin kategori listesini oluşturmanın daha ilginç bir yolu olduğunu varsayıyorum. – cco

+0

Bu tam olarak ihtiyacım olan şey. Bir milyona teşekkürler! – user3058703