使用Python Minidom解析XML时遇到问题

0 投票
1 回答
30 浏览
提问于 2025-04-14 17:38

我正在尝试用Python的xml minidom来解析一个XML文件。我只想提取法律姓名数据<wd:Legal_Name_Data>中的名字<wd:First_Name>和姓氏<wd:Last_Name>。我不想要<wd:Preferred_Name_Data>中的名字或姓氏,也不想要其他任何名字数据。下面是我正在解析的XML文件的一个示例。当然,这只是我需要提取数据的众多记录中的一条。

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://schema.xmlsoap.org/soap/envelope/">
    <env:Body>
        <wd:Get_Working_Response xmlns:wd="urn:com.workway/bsvc"
                                 wd:version="v40.1">
            <wd:Request_Criteria>
                <wd:Transaction_Log_Criteria_Data>
                </wd:Transaction_Log_Criteria_Data>
                <wd:Field_And_Parameter_Criteria_Data>
                </wd:Field_And_Parameter_Criteria_Data>
                <wd:Eligibility_Criteria_Data>
                </wd:Eligibility_Criteria_Data>
            </wd:Request_Criteria>
            <wd:Response_Filter>
            </wd:Response_Filter>
            <wd:Response_Group>
            </wd:Response_Group>
            <wd:Response_Results>
            </wd:Response_Results>
            <wd:Response_Data>
                <wd:Worker>
                    <wd:Worker_Reference>
                        <wd:ID wd:type="WID">787878787878787</wd:ID>
                        <wd:ID wd:type="Employee_ID">123456</wd:ID>
                    </wd:Worker_Reference>
                    <wd:Worker_Descriptor>John Smith</wd:Worker_Descriptor>
                    <wd:Worker_Data>
                        <wd:Worker_ID>123456</wd:Worker_ID>
                        <wd:User_ID>jsmith</wd:User_ID>
                        <wd:Personal_Data>
                            <wd:Name_Data>
                                <wd:Legal_Name_Data>
                                    <wd:Name_Detail_Data wd:Formatted_Name="John J. Smith"
                                                         wd:Reporting_Name="John J. Smith">
                                        <wd:Country_Reference>
                                            <wd:ID wd:type="WID">89989898989989898</wd:ID>
                                            <wd:ID wd:type="ISO_3166-1_Alpha-2_Code">US</wd:ID>
                                            <wd:ID wd:type="ISO_3166-1_Alpha-3_Code">USA</wd:ID>
                                            <wd:ID wd:type="ISO_3166-1_Numeric-3_Code">000000</wd:ID>
                                        </wd:Country_Reference>
                                        <wd:First_Name>John</wd:First_Name>
                                        <wd:Middle_Name>J.</wd:Middle_Name>
                                        <wd:Last_Name>Smith</wd:Last_Name>
                                    </wd:Name_Detail_Data>
                                </wd:Legal_Name_Data>
                                <wd:Preferred_Name_Data>
                                    <wd:Name_Detail_Data wd:Formatted_Name="Johnny James Smith"
                                                         wd:Reporting_Name="Johnny James Smith">
                                        <wd:Country_Reference>
                                            <wd:ID wd:type="WID">89989898989989898</wd:ID>
                                            <wd:ID wd:type="ISO_3166-1_Alpha-2_Code">US</wd:ID>
                                            <wd:ID wd:type="ISO_3166-1_Alpha-3_Code">USA</wd:ID>
                                            <wd:ID wd:type="ISO_3166-1_Numeric-3_Code">000000</wd:ID>
                                        </wd:Country_Reference>
                                        <wd:First_Name>Johnny</wd:First_Name>
                                        <wd:Middle_Name>James</wd:Middle_Name>
                                        <wd:Last_Name>Smith</wd:Last_Name>
                                    </wd:Name_Detail_Data>
                                </wd:Preferred_Name_Data>
                                <wd:Additional_Name_Data>
                                    <wd:Name_Detail_Data wd:Formatted_Name="John J. Smith"
                                                         wd:Reporting_Name="John J. Smith">
                                        <wd:Country_Reference>
                                            <wd:ID wd:type="WID">89989898989989898</wd:ID>
                                            <wd:ID wd:type="ISO_3166-1_Alpha-2_Code">US</wd:ID>
                                            <wd:ID wd:type="ISO_3166-1_Alpha-3_Code">USA</wd:ID>
                                            <wd:ID wd:type="ISO_3166-1_Numeric-3_Code">840</wd:ID>
                                        </wd:Country_Reference>
                                        <wd:First_Name>John</wd:First_Name>
                                        <wd:Middle_Name>J.</wd:Middle_Name>
                                        <wd:Last_Name>Smith</wd:Last_Name>
                                    </wd:Name_Detail_Data>
                                    <wd:Name_Type_Reference>
                                        <wd:ID wd:type="WID">89989898989989898</wd:ID>
                                        <wd:ID wd:type="Additional_Name_Type_ID">Preferred</wd:ID>
                                    </wd:Name_Type_Reference>
                                </wd:Additional_Name_Data>
                            </wd:Name_Data>

到目前为止,我尝试了下面的代码,但它返回了每条记录中的所有名字和姓氏。我该如何指定<wd:Legal_Name_Data>呢?

from xml.dom import minidom

doc = minidom.parse('myfile.xml')

firstlist =[]
lastlist=[]

first = doc.getElementsByTagName('wd:First_Name')
for name in first:
    first2 =name.firstChild.nodeValue
    firstlist.append(first2)

last = doc.getElementsByTagName('wd:Last_Name')
for lasts in last:
    last2 =lasts.firstChild.nodeValue
    lastlist.append(last2)

谢谢,
Nick

1 个回答

1

你需要先提取出合法的名称,像这样:

firstlist = []
lastlist = []

legal_names = doc.getElementsByTagName('wd:Legal_Name_Data')
for legal_name in legal_names:
    first = legal_name.getElementsByTagName('wd:First_Name')
    for name in first:
        first2 = name.firstChild.nodeValue
        firstlist.append(first2)

    last = legal_name.getElementsByTagName('wd:Last_Name')
    for lasts in last:
        last2 = lasts.firstChild.nodeValue
        lastlist.append(last2)

撰写回答