【问题标题】:Use Python to get value from element in XML file使用 Python 从 XML 文件中的元素中获取值
【发布时间】: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 解析器将每个用户的 &lt;rep&gt; 标记中的文本返回到列表中。我也希望按上次登录日期对其进行排序,但这不是我需要的,如果按日期排序会使此过程过于复杂,我将按字母顺序排列列表。

下面的代码显示了我尝试只打印数据而不将其保存到列表中,但输出也是意外的,如下所示。 我试过的代码:

#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"
    }
]

【问题讨论】:

    标签: python json xml


    【解决方案1】:

    因为这是带有命名空间的 xml,所以你可以像

    import xml.etree.ElementTree as ET
    root = ET.fromstring(xml_in_qes)
    my_ns = {'root': 'WebsiteWhereDataComesFrom.com'}
    myUser=[]
    for eachUser in root.findall('root:user',my_ns):
        rep=eachUser.find("root:rep",my_ns)
        print(rep.text)
        myUser.append(rep.text)
    

    注意:xml_in_qes 是这个问题中附加的 XML。

    ('root:user',my_ns): 在 my_ns 中搜索具有密钥 root 的用户,即 WebsiteWhereDataComesFrom.com

    【讨论】:

      【解决方案2】:

      我试过你的代码 - 结果如下:

      import xml.etree.ElementTree as ET
      xmlstring = '''
      <ArrayOfuser>
          <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>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>userinitials2</rep>
          </user>
          <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>userinitials3</rep>
          </user>
      </ArrayOfuser>
      '''
      
      user_array = ET.fromstring(xmlstring)
      
      replist = []
      for users in user_array.findall('user'):
          replist.append((users.find('rep').text))
      
      print(replist)
      

      代表列表输出:

      ['userinitials1', 'userinitials2', 'userinitials3']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-11
        • 2012-08-25
        • 1970-01-01
        • 1970-01-01
        • 2018-05-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多