【问题标题】:Using regex to convert XML representation to Dictionary in python在python中使用正则表达式将XML表示转换为字典
【发布时间】:2013-08-06 09:02:01
【问题描述】:

我基于this answer on SO在python中发送了一条POST消息。完成此操作后,我会从网站上得到如下所示的 XML 表示:

<status>Active</status>
<registeredname>MyTestName</registeredname>
<companyname>TEST</companyname>
<email>mytestemail@gmail.com</email>
<serviceid>8</serviceid>
<productid>1</productid>
<productname>Some Test Product</productname>
<regdate>2013-08-06</regdate>
<nextduedate>0000-00-00</nextduedate>
<billingcycle>One Time</billingcycle>
<validdomain>testing</validdomain>
<validip>XX.XX.XXX.XX</validip>
<validdirectory>/root</validdirectory>
<configoptions></configoptions>
<customfields></customfields>
<addons></addons>
<md5hash>58z9f70a9d738a98b18d0bf4304ac0c6</md5hash>

现在,我想将其转换为以下格式的 python 字典:

{"status": "Active", "registeredname": "MyTestName".......}

我尝试从中移植的相应 PHP 代码如下所示:

preg_match_all('/<(.*?)>([^<]+)<\/\\1>/i', $data, $matches);

我对应的Python代码如下:

matches = {}
matches = re.findall('/<(.*?)>([^<]+)<\/\\1>/i', data)

'data' 是我从服务器接收到的 XML 表示。当我运行它时,我的“匹配”字典仍然是空的。正则表达式语句有问题吗?还是我首先使用re.findall 是错误的?

提前致谢

【问题讨论】:

  • 真的不想用正则表达式来做这件事。这里有很多关于 SO 的答案,它们展示了如何使用像样的 XML 解析器来做到这一点。
  • 没有顶级 XML 标记,顺便说一句?这是整个文件吗?
  • 是的.. 没有顶级 XML 标记。这是整个文件。所以我猜它本身不是 XML 文档

标签: php python regex porting


【解决方案1】:

从正则表达式中删除前导/尾随 /s。无需逃避/。指定 flags=re.IGNORECASE 而不是尾随 i

matches = re.findall('<(.*?)>([^<]+)</\\1>', data, flags=re.IGNORECASE)
print(dict(matches))

使用原始字符串,无需转义\

matches = re.findall(r'<(.*?)>([^<]+)</\1>', data, flags=re.IGNORECASE)
print(dict(matches))

两个代码都打印:

{'status': 'Active', 'companyname': 'TEST', ...}

非正则表达式替代:lxml

使用lxml.html 而不是lxml.etree,因为data 不完整。

import lxml.html
print({x.tag:x.text for x in lxml.html.fromstring(data)})

【讨论】:

  • 这两个都将输出打印为字典。如何将它们存储为字典?因为当我给print matches时,我得到[('status', 'Active'), ('companyname', 'test'),....]
  • @i.h4d35,试试result = dict(matches)
  • 做到了.. 谢谢!!
猜你喜欢
  • 2012-09-18
  • 1970-01-01
  • 2014-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多