从XML文件中获取多个元素并将其转换为样式元素

时间:2018-01-31 22:07:29

标签: python xml python-3.x csv

我是python的初学者(约5个月),我目前正在努力弄清楚如何解析被检查为Yes的比赛,将它们转换成代表比赛的字母,然后取所有字母并将它们附加到名为multi_race的新节点。

我在考虑伪代码:

node = tree.findall('race_white')
for element in elements:
    element sub ('Yes', 'A')
    element write tree to xml

以下是起始XML:

<application>
    <lastname>lastname</lastname>
    <firstname>first</firstname>
    <middlename>middle</middlename>
    <sex>Male</sex>
    <BIRTH>01/01/1980</BIRTH>
    <hispanic_latino></hispanic_latino>
    <race_white>Yes</race_white>  #CodeA
    <race_black></race_black>     #CodeB
    <race_asian></race_asian>     #CodeC
    <race_american_indian></race_american_indian>  #CodeD
    <race_pacific_islander></race_pacific_islander> #CodeE

以下是我想要的结果:

<application>
    <lastname>lastname</lastname>
    <firstname>first</firstname>
    <middlename>middle</middlename>
    <sex>Male</sex>  
    <BIRTH>01/01/1980</BIRTH>
    <hispanic_latino></hispanic_latino>
    <multi_race>A,</multi_race>

1 个答案:

答案 0 :(得分:0)

您可以遍历应用程序的所有元素,并且对于带有种族标记的每个元素,您可以保存要添加的相应字母。迭代完所有标记后,您可以创建一个新元素,并将标记作为连接字母。示例代码:(现在未经测试)

    race_to_letter_map = {
        'race_white': 'A',
        'race_black': 'B'
        # add more races
    }

    applications = tree.findall('application')
    for application in applications:
        races = []
        elements_to_delete = []
        for xml_element in application:  # iterate over all elements of application
            # check whether the current child indicates one of the races
            race_letter = race_to_letter_map.get(xml_element.tag, None)
            if race_letter is not None:
                elements_to_delete.append(xml_element)
                if xml_element.text == 'Yes':
                    races.append(race_letter)

        # removing the now unwanted tags
        for xml_element in elements_to_delete:
            application.remove(xml_element)

        # creating the resulting element and append it to application
        multi_race_element = Element('multi_race')
        multi_race_element.text = ",".join(races)
        application.append(multi_race_element)