繁体   English   中英

Python列表到XML,反之亦然

[英]Python list to XML and vice versa

我有一些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 Array转换回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()对pack()和unpack()执行与基本数据类型(int,long,string,boolean)相同的操作。

从里到外:

def group(seq, k):
    return [seq[i:i+k] for i in range(0, len(seq), k)]

unflattened = group(group(data, 2), 2)

如果您的尺寸不尽相同,那么您的示例可能会更容易。 但我认为上面的代码应该可行。

请尝试以下方法:

from operator import mul

def validate(array, sizes):
    if reduce(mul, sizes) != len(array):
        raise ValueError("Array dimension incompatible with desired sizes")

    return array, sizes

def reshape(array, sizes):
    for s in sizes:
        array = [array[i:i + s] for i in range(0, len(array), s)]

    return array[0]

data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
length = [2, 2, 3]

print reshape(validate(data, length))

length = [2, 2, 2]

print reshape(validate(data, length))

输出为:

[[[1, 2], [3, 4]], [[5, 6], [7, 8]], [[9, 10], [11, 12]]]
Traceback:
   (...)
ValueError: Array dimension incompatible with desired sizes

另一种方法是使用numpy数组。 请注意,对于这个简单的任务,numpy是一个相当大的依赖,但你会发现大多数(常见的)数组相关的任务/问题已经在那里有一个实现:

from numpy import array

print array(data).reshape(*length)  # optionally add .tolist() to convert to list

编辑 :添加数据验证

编辑 :使用numpy数组的示例(感谢JFSebastian的提示)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM