Python 使用etree分析xml时无法返回子值

Python 使用etree分析xml时无法返回子值,python,xml,elementtree,Python,Xml,Elementtree,我有一个xml文件,看起来像 <?xml version="1.0" encoding="UTF-8" ?> <FullReport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <firm>1426</firm> <reportDate>07FEB2020_18:00:00.000000</reportDate> <roo

我有一个xml文件,看起来像

<?xml version="1.0" encoding="UTF-8" ?>
<FullReport
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <firm>1426</firm>
    <reportDate>07FEB2020_18:00:00.000000</reportDate>
    <rooms>
        <room>
            <roomID>PCHAT-0x0000000000000637</roomID>
            <roomTitle>FX - WBB - CTON</roomTitle>
            <description>global chat</description>
            <creationDate></creationDate>
            <removalDate></removalDate>
            <lastActivityDate>02/07/2020 12:26:24</lastActivityDate>
            <status>Active</status>
            <membership>Bilateral</membership>
            <isAnonymous>false</isAnonymous>
            <hasActiveAdmins>true</hasActiveAdmins>
            <activeUserCount>17</activeUserCount>
            <distinctFirmsInRoom>2</distinctFirmsInRoom>
            <isInternalOnly>false</isInternalOnly>
            <isIncognitoForum>false</isIncognitoForum>
        </room>
        <users>
            <uuid>6820</uuid>
            <bbgEmail>SJONES@Bloomberg.net</bbgEmail>
            <fullName>SEAN JONES</fullName>
            <firmName>BANK OF TEST</firmName>
            <firmNumber>1400</firmNumber>
            <accountNumber>51067</accountNumber>
            <accountName>BANK OF TEST</accountName>
            <inviteDate>01/07/2013 22:00:39</inviteDate>
            <isDeleted>false</isDeleted>
            <isAdmin>false</isAdmin>
            <isCreator>false</isCreator>
            <roomAlias>CTON</roomAlias>
            <corpEmail>sean.jones@botest.com</corpEmail>
            <city>LONDON</city>
        </users>
        <users>
            <uuid>6820</uuid>
            <bbgEmail>SSMITH@Bloomberg.net</bbgEmail>
            <fullName>SEAN SMITH</fullName>
            <firmName>BANK OF TEST</firmName>
            <firmNumber>1400</firmNumber>
            <accountNumber>51067</accountNumber>
            <accountName>BANK OF TEST</accountName>
            <inviteDate>01/07/2013 22:00:39</inviteDate>
            <isDeleted>false</isDeleted>
            <isAdmin>false</isAdmin>
            <isCreator>false</isCreator>
            <roomAlias>CTON</roomAlias>
            <corpEmail>sean.smith@botest.com</corpEmail>
            <city>LONDON</city>
        </users>
</FullReport>
</FullReport>
打印room_child.tag和room_child.text时,我看不到值吗?这是一个全新的概念,所以我不确定我错过了什么

返回的结果是:

我的最终目标是迭代每个值并转换为CSV,但我无法访问这些值,也无法确定为什么没有数据返回。我希望最终的csv看起来与类似,csv中的每个用户都有一行


当您在root:中为child运行
时,此循环仅迭代
在您的案例中,FullReport的直接后代:公司,
报告日期和房间,所以它没有机会到达房间,这是
位于较低一步的位置

从您的代码(第一个循环)中,我发现您确实感兴趣 在FullReport/rooms/rooms的直接后代中

要打印其标记名和文本内容,您可以运行,例如:

for child in root.iter('room'):
    for step_child in child:
        print(f'{step_child.tag:20} {step_child.text}')
对于示例输入,结果是:

roomID               PCHAT-0x0000000000000637
roomTitle            FX - WBB - CTON
description          global chat
creationDate         None
removalDate          None
lastActivityDate     02/07/2020 12:26:24
status               Active
membership           Bilateral
isAnonymous          false
hasActiveAdmins      true
activeUserCount      17
distinctFirmsInRoom  2
isInternalOnly       false
isIncognitoForum     false
就您的最终任务而言,您可以运行:

rows = []
for child in root.iter('rooms'):
    roomId, roomTitle = 'id', 'ttl'
    for it in child:
        if it.tag == 'room':
            roomId = it.findtext('roomID')
            roomTitle = it.findtext('roomTitle')
        elif it.tag == 'users':
            rows.append([roomId, roomTitle, it.findtext('uuid'), it.findtext('bbgEmail'),
                it.findtext('fullName'), it.findtext('firmName')])
df = pd.DataFrame(rows, columns=['roomId', 'roomTitle', 'uuid', 'bbgEmail',
    'fullName', 'firmName'])
上面的代码基于房间元素首先出现的假设 在它们之后是用户元素


并添加与您的帖子中未显示的任何其他列相关的代码。

请提供一个链接。此外,您共享的代码的格式似乎已损坏。您想要的输出是什么?我想查看每个“房间”的数据以及附加到每个房间的“用户”。我想将其简化为csv。现在添加了可复制的代码。因此,我希望打印每个“文件室”的属性及其值,以及附加到文件室的每个“用户”的属性/值;你能编辑并修复它吗?
rows = []
for child in root.iter('rooms'):
    roomId, roomTitle = 'id', 'ttl'
    for it in child:
        if it.tag == 'room':
            roomId = it.findtext('roomID')
            roomTitle = it.findtext('roomTitle')
        elif it.tag == 'users':
            rows.append([roomId, roomTitle, it.findtext('uuid'), it.findtext('bbgEmail'),
                it.findtext('fullName'), it.findtext('firmName')])
df = pd.DataFrame(rows, columns=['roomId', 'roomTitle', 'uuid', 'bbgEmail',
    'fullName', 'firmName'])