2017-03-29 3 views
6

Ich habe eine XML-Datei:XML ElementTree - Indizierung Tags

<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> 

Verwendung von XML ElementTree, würde Ich mag einen Tag <Opinion> einzufügen, die category= ein Attribut hat. Sagen wir, ich habe eine Liste von Zeichen list = ['a', 'b', 'c'] ist es möglich, schrittweise sie so zu jedem Text asign ich habe:

<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> 

Ich bin bewusst, dass ich den Satz id-Attribut verwenden können, aber dies würde eine Menge Umstrukturierung meiner erfordern Code. Grundsätzlich wäre ich in der Lage, jeden Satzeintrag in Übereinstimmung mit meinem Listenindex zu indexieren.

+2

Attribute sind ein Wörterbuch. Die Reihenfolge der Wörterbücher kann nicht garantiert werden. – leovp

+0

Oh, ich verstehe. Arbeitet mit dem Validator (überprüft als Goldstandard) und muss daher nicht geändert werden. Vielen Dank! – user3058703

+0

Können Sie ein reproduzierbares Beispiel machen? – kilojoules

Antwort

4

Sie können die Factory-Funktion SubElement verwenden, um Elemente zum Baum hinzuzufügen. ist die XML-Daten Angenommen, in einer Variablen data genannt, wird dies die Elemente in Ihrem Dokument Baum hinzufügen:

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' stoppt, wenn das kürzeste übergelaufene iterable abgelaufen ist, so dass das Slicing, das Sie vorschlagen, nicht benötigt wird (weil es keinen Unterschied macht). In jedem Fall nehme ich an, dass das OP eine interessantere Möglichkeit hat, die Kategorieliste zu erzeugen. – cco

+0

Genau das habe ich gebraucht. Tausend Dank! – user3058703