использование python для замены существующего значения дочернего атрибута значением дочернего тега - PullRequest
0 голосов
/ 20 марта 2019

Я хочу иметь возможность проанализировать несколько ReportCharacters и убедиться, что все используют номер characterID в атрибуте имени ReportCharacter, а не фактическое имя символа.

Как я могупроанализируйте и сравните ReportCharacter name, а если CharacterID нет, замените имя на соответствующее значение CharacterID?

Это пример исходного файла:

'    <?xml version="1.0" ?>
    <CharacterData>
    <Report>
    <ReportCharacter name="scoobydoo">
    <CharacterProperties>
    <tag name="charactername">scoobydoo</tag>
    <tag name="characterID">1024724312</tag>
    <tag name="characterSTART">Sat Sep 15 02:01:56 2018</tag>
    </CharacterProperties>
    </ReportCharacter>
    <ReportCharacter name="mickey">
    <CharacterProperties>
    <tag name="charactername">mickey</tag>
    <tag name="characterID">1024724313</tag>
    <tag name="characterSTART">Sat Sep 15 02:01:56 2018</tag>
    </CharacterProperties>
    </ReportCharacter>
    <ReportCharacter name="goofy">
    <CharacterProperties>
    <tag name="charactername">goofy</tag>
    <tag name="characterID">1024724314</tag>
    <tag name="characterSTART">Sat Sep 15 02:01:56 2018</tag>
    </CharacterProperties>
    </ReportCharacter>
    </Report>
    </CharacterData>'

Вот как бы я хотел, чтобы измененный файл выглядел так:

'    <?xml version="1.0" ?>
    <CharacterData>
    <Report>
    <ReportCharacter name="1024724312">
    <CharacterProperties>
    <tag name="charactername">scoobydoo</tag>
    <tag name="characterID">1024724312</tag>
    <tag name="characterSTART">Sat Sep 15 02:01:56 2018</tag>
    </CharacterProperties>
    </ReportCharacter>
    <ReportCharacter name="1024724313">
    <CharacterProperties>
    <tag name="charactername">mickey</tag>
    <tag name="characterID">1024724313</tag>
    <tag name="characterSTART">Sat Sep 15 02:01:56 2018</tag>
    </CharacterProperties>
    </ReportCharacter>
    <ReportCharacter name="1024724314">
    <CharacterProperties>
    <tag name="charactername">goofy</tag>
    <tag name="characterID">1024724314</tag>
    <tag name="characterSTART">Sat Sep 15 02:01:56 2018</tag>
    </CharacterProperties>
    </ReportCharacter>
    </Report>
    </CharacterData>'

1 Ответ

0 голосов
/ 20 марта 2019
import xml.etree.ElementTree as ET

tree = ET.parse('characters.txt')
root = tree.getroot()

for character in root.iter('ReportCharacter'):
    current_name = character.get('name', '')
    if current_name.isdecimal():
        continue

    name = character.findtext('.//tag[@name="characterID"]')
    if name:
        character.set('name', name)

with open('characters_parsed.xml', 'w') as file_out:
    tree.write(file_out, encoding='unicode', short_empty_elements=True)
...