我目前正在处理一些有趣的 XML字符串响应。本质上,我接收的XML是嵌套的,但它读起来像一个CSV文件。例如:
xml = <?xml version="1.0" encoding="ISO-8859-1"?>
<ThisDocument protocol="OCI" xmlns="C" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<sessionId xmlns="">29348u29!!4nthisSucks!==</sessionId>
<command echo="" xsi:type="GroupGetListInServiceProviderResponse" xmlns="">
<groupTable>
<colHeading>Group Id</colHeading>
<colHeading>Group Name</colHeading>
<colHeading>User Limit</colHeading>
<row>
<col>LRB7905</col>
<col>Test1</col>
<col>25</col>
</row>
<row>
<col>LRB9294</col>
<col>Test2</col>
<col>100</col>
</row>
<row>
<col>LRB8270</col>
<col>Test3</col>
<col>10</col>
</row>
<row>
<col>LRB8212</col>
<col>Test4</col>
<col>25</col>
</row>
<row>
<col>LRB8175</col>
<col>Test5</col>
<col>25</col>
</row>
</groupTable>
</command>
</ThisDocument>
在我从相关服务器收到的回复中,&#39; colHeading&#39;是关键&#39;为了和&#39; col&#39;对于每一行&#39;对应于该值。这似乎是一个简单的地图结构,但我想不出一个PYTHONIC&#39;执行此任务的方法。期望的结果是:
{
"groupTable": [
{
"Group ID": "LRB7905",
"Group Name": "Test1",
"User Limit": "25"
},
{
"Group ID": "LRB9294",
"Group Name": "Test2",
"User Limit": "100"
},
{
"Group ID": "LRB8270",
"Group Name": "Test3",
"User Limit": "10"
},
{
"Group ID": "LRB8212",
"Group Name": "Test4",
"User Limit": "25"
},
{
"Group ID": "LRB8175",
"Group Name": "Test5",
"User Limit": "25"
}
]
}
我真正需要的信息包含在&#39; col&#39; XML的字段和colHeadings的数量对应于每个&#39;行中的值的数量。到目前为止,我已经能够将值操作为CSV文件,但最终,我需要使用键值对创建JSON对象(dicts)。我使用过不同的库/模块等......但我提出的最佳方法是将colHeadings和Values分解为两个列表,然后将它们组合起来。
到目前为止代码:
xmlroot = ET.fromstring(xml)
headings =[]
values = []
def breakoutLists(xmlroot):
for columnHeading in root.iter('colHeading'):
headings.append(columnHeading.text)
for column in root.iter('col'):
values.append(column.text)
return headings, values
breakoutLists(xmlroot)
zipped = dict(itertools.izip(values, itertools.cycle(headings)))
print zipped
这会产生一个字典,但是大约values: keys
而不是keys: values
。
我很欣赏有关处理此任务的最佳方式的任何建议。 在此先感谢!!!
编辑感谢Eric的帮助,我完成了目标!
groupResp = {'groupResponse': []}
def breakoutLists(root):
headings = [h.text for h in root.iter('colHeading')]
return (
{
h: col.text
for h, col in zip(headings, row.iter('col'))
}
for row in root.iter('row')
)
data = list(breakoutLists(root))
for item in data:
groupResp['groupResponse'].append(item)
print json.dumps(groupResp)
我可以在初始功能期间将这一点清理干净以附加字典,但我现在很好!
答案 0 :(得分:2)
您的代码会使数据变得扁平化,这是不合适的 - 您需要遍历行对象
def breakoutLists(xmlroot):
headings = [h.text for h in root.iter('colHeading')]
return (
{
h: col.text
for h, col in zip(headings, row.iter('column'))
}
for row in root.iter('row')
)
data = list(breakoutLists(html))