簡體   English   中英

通過插入父節點來更改子節點值

[英]Change Child Node Values by inserting parent nodes iterative

import xml.etree.ElementTree as xml

root = xml.Element('XmlToTs')
Eit = xml.Element('Eit')
root.append(Eit)


xml.SubElement(Eit, "Pid").text = "18"
Event = xml.Element("Event")
xml.SubElement(Event, "EventId").text = "12677" 
Short = xml.SubElement(Event, "ShortEventDescriptor")
xml.SubElement(Short, "Iso639LanguageCode").text = "deu" 
xml.SubElement(Short, "EventName").text = "Talk am Teich" 
xml.SubElement(Short, "Text").text = "Heute wird mit den Enten getalked" 

EID=12500
Eit.append(Event)
Eit.append(Event)
Eit.append(Event)
for EventId in Eit.iter('EventId'):
    EventId.text = str(EID)
    EID=EID+1

我想有多個帶有默認子級的“事件”節點。 之后,我要遍歷所有內容並修改其子文本。

但是目前iter循環為所有EventId提供了12502

謝謝克里斯蒂安

當調用Event = xml.Element("Event")時,可以創建Event元素的一個實例。 通過將此實例傳遞給.append()方法並調用它(在您的情況中為3次),ElementTree追加了三個EventId-Elments,但是實際上內存中只有一個 EventId-Element。 您可以使用以下幾行進行檢查:

import xml.etree.ElementTree as xml

root = xml.Element('XmlToTs')
Eit = xml.Element('Eit')
root.append(Eit)

xml.SubElement(Eit, "Pid").text = "18"

Event = xml.Element("Event")
xml.SubElement(Event, "EventId").text = "12677"
Short = xml.SubElement(Event, "ShortEventDescriptor")
xml.SubElement(Short, "Iso639LanguageCode").text = "deu" 
xml.SubElement(Short, "EventName").text = "Talk am Teich" 
xml.SubElement(Short, "Text").text = "Heute wird mit den Enten getalked" 

Eit.append(Event)
Eit.append(Event)
Eit.append(Event)

for EventId in Eit.iter('EventId'):
    print(EventId)

輸出是這樣的:

<ELment 'EventId' at 0x17ee170>
<ELment 'EventId' at 0x17ee170>
<ELment 'EventId' at 0x17ee170>

如您所見, 所有 EventId元素都具有相同的內存加法器!

當您通過.iter()方法遍歷所有EventId-Tags時,可以在XML代碼中找到ElmentTree,在每次迭代中,您都在訪問相同的對象,即相同的 EventId-Tag。 這就是為什么將每個EventId-Element的所有文本屬性分配給相同的數字12502的原因; 12500增加了兩次。

簡而言之,您需要創建多個EventId實例。 例如在for循環中:

for _ in range(3):
    Event = xml.Element("Event")

    xml.SubElement(Event, "EventId").text = "12677"

    Short = xml.SubElement(Event, "ShortEventDescriptor")

    xml.SubElement(Short, "Iso639LanguageCode").text = "deu" 
    xml.SubElement(Short, "EventName").text = "Talk am Teich" 
    xml.SubElement(Short, "Text").text = "Heute wird mit den Enten getalked" 

    Eit.append(Event)

之后,您可以運行您的代碼...

EID=12500

for EventId in Eit.iter('EventId'):
    EventId.text= str(EID)
    EID += 1

...而且效果很好! :)


完整的源代碼:

import xml.etree.ElementTree as xml
from xml.dom import minidom

root = xml.Element('XmlToTs')
Eit = xml.Element('Eit')
root.append(Eit)


xml.SubElement(Eit, "Pid").text = "18"

for _ in range(3):
    Event = xml.Element("Event")

    xml.SubElement(Event, "EventId").text = "12677"

    Short = xml.SubElement(Event, "ShortEventDescriptor")

    xml.SubElement(Short, "Iso639LanguageCode").text = "deu" 
    xml.SubElement(Short, "EventName").text = "Talk am Teich" 
    xml.SubElement(Short, "Text").text = "Heute wird mit den Enten getalked" 


    Eit.append(Event)


EID=12500

for EventId in Eit.iter('EventId'):
    EventId.text= str(EID)
    EID += 1


#print the generated XML code

def prettify(elem):
    """Return a pretty-printed XML string for the Element.
    """
    rough_string = xml.tostring(elem, 'utf-8')
    reparsed = minidom.parseString(rough_string)
    return reparsed.toprettyxml(indent=" ")

print(prettify(Eit))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM