我正在try 使用python的minidom过滤一个XML文件.我希望根据地址是工作邮箱地址的标准返回邮箱地址列表(<wd:Email_Address>).我需要使用元素<wd:id wd:type="Communication_Usage_Type_ID">WORK</wd:ID>来过滤邮箱地址.以下是该文件:

<?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:Email_Address_Data>
                                <wd:Email_Address>jsmith2222@gmail.com</wd:Email_Address>
                                <wd:Usage_Data wd:Public="0">
                                    <wd:Type_Data wd:Primary="1">
                                        <wd:Type_Reference>
                                            <wd:ID wd:type="WID">000000000000000</wd:ID>
                                            <wd:ID wd:type="Communication_Usage_Type_ID">HOME</wd:ID>
                                        </wd:Type_Reference>
                                    </wd:Type_Data>
                                </wd:Usage_Data>
                                <wd:Email_Reference>
                                    <wd:ID wd:type="WID">99999999999999999999999</wd:ID>
                                    <wd:ID wd:type="Email_ID">EMAIL_REFERENCE-3-3960</wd:ID>
                                </wd:Email_Reference>
                                <wd:ID>EMAIL_REFERENCE-3-3960</wd:ID>
                            </wd:Email_Address_Data>
                            <wd:Email_Address_Data>
                                <wd:Email_Address>jsmith@something.com</wd:Email_Address>
                                <wd:Usage_Data wd:Public="1">
                                    <wd:Type_Data wd:Primary="1">
                                        <wd:Type_Reference>
                                            <wd:ID wd:type="WID">999999999999999999999999999</wd:ID>
                                            <wd:ID wd:type="Communication_Usage_Type_ID">WORK</wd:ID>
                                        </wd:Type_Reference>
                                    </wd:Type_Data>
                                </wd:Usage_Data>
                                <wd:Email_Reference>
                                    <wd:ID wd:type="WID">999999999999999999999999</wd:ID>
                                    <wd:ID wd:type="Email_ID">EMAIL_REFERENCE-3-4017</wd:ID>
                                </wd:Email_Reference>
                                <wd:ID>EMAIL_REFERENCE-3-4017</wd:ID>
                            </wd:Email_Address_Data>
                            </wd:Personal_Data>
                    </wd:Worker_Data>   
            </wd:Worker>
        </wd:Response_Data>
    </wd:Get_Working_Response>
</env:Body>
</env:Envelope>

到目前为止,我已经能够获得一个包含用于工作的过滤的DOM元素的列表(工作元素).我认为我需要使用它以某种方式过滤文件并将结果放在一个列表(LNodesWithLevel2)中,该列表只包含工作邮箱的Email_Address_Data元素.一旦我有了这些元素,我应该能够获得EMAIL_ADDRESS的值.任何帮助都将不胜感激.我对使用其他库持开放态度,如果这更容易的话.以下是我目前掌握的情况:

xmlDoc = minidom.parse('XML_Example.xml')

workelements =[]
lNodesWithLevel1 = xmlDoc.getElementsByTagName('wd:ID')
for mynodes in lNodesWithLevel1:
    if mynodes.firstChild.nodeValue == 'WORK':
        workelements.append(mynodes)

lNodesWithLevel2 = [lNode for lNode in xmlDoc.getElementsByTagName('wd:Email_Address_Data')
                 if lNode.getElementsByTagName('wd:ID') == li]

推荐答案

有了xml.dom.minidom,您可以做到:

import xml.dom.minidom

xmlDoc = xml.dom.minidom.parse('XML_Example.xml')

business = []
for email in xmlDoc.getElementsByTagName("wd:Email_Address_Data"):
    for t in email.getElementsByTagName("wd:ID"):
        if t.getAttribute("wd:type") == "Communication_Usage_Type_ID":
            business_mail = t.firstChild.nodeValue
    for m in email.getElementsByTagName("wd:Email_Address"):
        if business_mail == "WORK":
            business.append(m.firstChild.nodeValue)

print("WORK EMAILs:", business) 

输出:

WORK EMAILs: ['jsmith@something.com']

Python相关问答推荐

Python会扔掉未使用的表情吗?

时间序列分解

如何从具有不同len的列表字典中创建摘要表?

运行终端命令时出现问题:pip start anonymous"

如何在类和classy-fastapi -fastapi- followup中使用FastAPI创建路由

如何将一个动态分配的C数组转换为Numpy数组,并在C扩展模块中返回给Python

我对我应该做什么以及我如何做感到困惑'

将输入聚合到统一词典中

考虑到同一天和前2天的前2个数值,如何估算电力时间序列数据中的缺失值?

polars:有效的方法来应用函数过滤列的字符串

Pandas—堆栈多索引头,但不包括第一列

如何过滤组s最大和最小行使用`transform`'

简单 torch 模型测试:ModuleNotFoundError:没有名为';Ultralytics.yolo';

Python如何导入类的实例

将数字数组添加到Pandas DataFrame的单元格依赖于初始化

一维不匹配两个数组上的广义ufunc

具有不匹配列的2D到3D广播

有没有一种方法可以根据不同索引集的数组从2D数组的对称子矩阵高效地构造3D数组?

关于数字S种子序列内部工作原理的困惑

如何计算Pandas 中具有特定条件的行之间的天差