【发布时间】:2022-12-03 01:51:30
【问题描述】:
我正在用 Python 编写一个程序,该程序查看从 API 获得的 XML 文件,并且应该将用户姓名首字母列表返回到列表以供以后使用。我的 XML 文件看起来像这样,大约有 60 个用户:
<ArrayOfuser xmlns="WebsiteWhereDataComesFrom.com" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<user>
<active>true</active>
<datelastlogin>8/21/2019 9:16:30 PM</datelastlogin>
<dept>3</dept>
<email>useremail</email>
<firstname>userfirstname</firstname>
<lastname>userlastname</lastname>
<lastupdated>2/6/2019 11:10:29 PM</lastupdated>
<lastupdatedby>lastupdateduserinitials</lastupdatedby>
<loginemail>userloginemail</loginemail>
<phone1>userphone</phone1>
<phone2/>
<rep>userinitials1</rep>
</user>
<user>
<active>true</active>
<datelastlogin>12/1/2022 3:31:25 PM</datelastlogin>
<dept>5</dept>
<email>useremail</email>
<firstname>userfirstname</firstname>
<lastname>userlastname</lastname>
<lastupdated>4/8/2020 3:02:08 PM</lastupdated>
<lastupdatedby>lastupdateduserinitials</lastupdatedby>
<loginemail>userloginemail</loginemail>
<phone1>userphone</phone1>
<phone2/>
<rep>userinitials2</rep>
</user>
...
...
...
</ArrayOfuser>
我正在尝试使用 XML 解析器将每个用户的 <rep> 标记中的文本返回到列表中。我也希望按上次登录日期对其进行排序,但这不是我需要的,如果按日期排序会使此过程过于复杂,我将按字母顺序排列列表。
下面的代码显示了我尝试只打印数据而不将其保存到列表中,但输出也是意外的,如下所示。 我试过的代码:
#load file
activeusers = etree.parse("activeusers.xml")
#declare namespaces
ns = {'xx': 'http://schemas.datacontract.org/2004/07/IQWebAPI.Users'}
#locate rep tag and print (saving to list once printing shows expected output)
targets = activeusers.xpath('//xx:user[xx:rep]',namespaces=ns)
for target in targets:
print(target.attrib)
输出:
{}
{}
我希望输出看起来像下面的代码块。一旦它看起来像那样,我应该能够更改打印语句而不是保存到列表中。
{userinitials1}
{userinitials2}
我认为我的问题来自打印属性的打印语句中的内容。我尝试使用 target.getparent() 与 keys()、items() 和 get() 的变体,它们在打印时似乎都显示相同的空输出。
编辑:我发现了一个已经解决了类似问题的人的帖子,解决方案是使用这段代码,但我更改了文件名以满足我的需要:
root = (etree.parse("activeusers.xml"))
values = [s.find('rep').text for s in root.findall('.//user') if s.find('rep') is not None]
print(values)
同样,预期的输出是一个填充列表,但打印时列表是空的。我认为现在我的问题可能与我的文档包含名称空间这一事实有关。对于我的使用,我可能只是删除它们,因为我认为这些最终不会被需要,所以如果名称空间比我意识到的更重要,请纠正我。
第二次编辑:我还意识到 API 可以以 JSON 格式向我发送此数据,而不仅仅是 XML,因此该文件看起来像下面的代码块。任何可以将每个用户的“rep”子项中的文本附加到 JSON 格式或 XML 列表的解决方案都是完美的并且将不胜感激,因为一旦我有了这个列表,我将不需要使用 XML 或 JSON 文件来任何其他用途。
[
{
"active": true,
"datelastlogin": "8/21/2019 9:16:30 PM",
"dept": 3,
"email": "useremail",
"firstname": "userfirstname",
"lastname": "userlastname",
"lastupdated": "2/6/2019 11:10:29 PM",
"lastupdatedby": "lastupdateduserinitials",
"loginemail": "userloginemail",
"phone1": "userphone",
"phone2": "",
"rep": "userinitials1"
},
{
"active": true,
"datelastlogin": "12/1/2022 3:31:25 PM",
"dept": 5,
"email": "useremail",
"firstname": "userfirstname",
"lastname": "userlastname",
"lastupdated": "4/8/2020 3:02:08 PM",
"lastupdatedby": "lastupdateduserinitials",
"loginemail": "userloginemail",
"phone1": "userphone",
"phone2": "",
"rep": "userinitials2"
}
]
【问题讨论】: