我编写了一些 python 代码,用于将 python 列表转换为 XML 元素。它用于与 LabVIEW 交互,因此是奇怪的 XML 数组格式。无论如何,这是代码:
def pack(data):
# create the result element
result = xml.Element("Array")
# report the dimensions
ref = data
while isinstance(ref, list):
xml.SubElement(result, "Dimsize").text = str(len(ref))
ref = ref[0]
# flatten the data
while isinstance(data[0], list):
data = sum(data, [])
# pack the data
for d in data:
result.append(pack_simple(d))
# return the result
return result
现在我需要编写一个 unpack() 方法来将打包的 XML 数组转换回 python 列表。我可以很好地提取数组维度和数据:
def unpack(element):
# retrieve the array dimensions and data
lengths = []
data = []
for entry in element:
if entry.text == "Dimsize":
lengths.append(int(entry.text))
else:
data.append(unpack_simple(entry))
# now what?
但我不确定如何展平阵列。什么是这样做的有效方法?
编辑:这是 python 列表和相应的 XML 的样子。注意:数组是 n 维的。
data = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
然后是 XML 版本:
<Array>
<Dimsize>2</Dimsize>
<Dimsize>2</Dimsize>
<Dimsize>2</Dimsize>
<I32>
<Name />
<Val>1</Val>
</I32>
... 2, 3, 4, etc.
</Array>
不过,实际格式并不重要,我只是不知道如何从以下位置展开列表:
data = [1, 2, 3, 4, 5, 6, 7, 8]
回到:
data = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
给定:
lengths = [2, 2, 2]
假设 pack_simple() 和 unpack_simple() 对基本数据类型(int、long、string、boolean)执行相同的 pack() 和 unpack()。