Hướng dẫn array to xml python - mảng sang xml python

Tôi có một số mã Python mà tôi đã viết để chuyển đổi danh sách Python thành một phần tử XML. Nó có nghĩa là để tương tác với LabView, do đó định dạng mảng XML kỳ lạ. Dù sao, đây là mã:

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

Bây giờ tôi cần viết một phương thức unpack () để chuyển đổi mảng XML được đóng gói trở lại thành danh sách python. Tôi có thể trích xuất các kích thước mảng và dữ liệu chỉ tốt:

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?

Nhưng tôi không chắc chắn làm thế nào để không phù hợp với mảng. Điều gì sẽ là một cách hiệu quả để làm điều đó?

Chỉnh sửa: Đây là danh sách Python và XML tương ứng trông như thế nào. Lưu ý: Các mảng là N chiều.

data = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]

Và sau đó là phiên bản XML:


  2
  2
  2
  
    
    1
  

  ... 2, 3, 4, etc.

Định dạng thực tế không quan trọng, tôi chỉ không biết làm thế nào để không thể hiểu được danh sách từ:

data = [1, 2, 3, 4, 5, 6, 7, 8]

Trở lại:

data = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]

given:

lengths = [2, 2, 2]

Giả sử pack_simple () và unpack_simple () làm giống như gack () và unpack () cho các loại dữ liệu cơ bản (int, long, chuỗi, boolean).

Cách tiếp cận của Jack có vẻ dễ dàng hơn, đây là một cách khác bao gồm cả những nhận xét bạn cần:

  1. Đọc tệp của bạn bằng trình phân tích cú pháp để giữ bình luận
  2. Chèn nhận xét bằng cách sử dụng
    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?
    
    0
  3. Vòng lặp qua danh sách từ điển và thêm các phần tử phụ vào XML
  4. Sử dụng
    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?
    
    1 để chuyển XML chuyển đổi thành chuỗi được định dạng, nhưng điều này thêm các dòng mới không cần thiết
  5. Xóa các dòng mới bằng cách sử dụng danh sách hiểu và
    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?
    
    2
  6. Thêm thông tin mã hóa vào khai báo XML
  7. ghi vào tệp gốc
import xml.etree.ElementTree as ET
import xml.dom.minidom

memorys = [
    {'location': 'DIMM1', 'banklabel': 'ChannelA', 'cap': '100'},
    {'location': 'DIMM2', 'banklabel': 'ChannelB', 'cap': '200'}
]

m_encoding = 'utf-8'
parser = ET.XMLParser(target=ET.TreeBuilder(insert_comments=True))

tree = ET.parse('sampleXml.xml', parser=parser)
root = tree.getroot()

root.insert(1, ET.Comment('memory'))

unit_mem = ET.SubElement(root, 'unitmemory')
unit_mem.insert(0, ET.Comment('data'))

for mem in memorys:
    m_module = ET.SubElement(unit_mem, 'module ')
    m_module.set('location', mem['location'])

    b_label = ET.SubElement(m_module, 'banklabel  ')
    m_cap = ET.SubElement(m_module, 'cap ')
    b_value = ET.SubElement(b_label, 'value ')
    c_value = ET.SubElement(m_cap, 'value ')

    m_module.set('location', mem['location'])
    b_label.set('tool', 'banklabel')
    m_cap.set('tool', 'cap')
    b_value.set('type', 'string')
    c_value.set('type', 'string')

    b_value.text = mem['banklabel']
    c_value.text = mem['cap']

dom = xml.dom.minidom.parseString(ET.tostring(root))
xml_string = dom.toprettyxml()
xml_string = '\n'.join([line for line in xml_string.splitlines() if line.strip()])
part1, part2 = xml_string.split('?>')

with open("sampleXml.xml", 'w') as xfile:
    xfile.write(part1 + 'encoding=\"{}\"?>\n'.format(m_encoding) + part2)
    xfile.close()

Đầu vào của tôi

{'location': 'DIMM1', 'banklabel': 'ChannelA', 'cap': '100'}
{'location': 'DIMM2', 'banklabel': 'ChannelB', 'cap': '200'}

Đầu ra của tôi




    
        
            
            
        
        
        
            
            
        
    
    
    
        
        
            
                ChannelA
            
            
                100
            
        
        
            
                ChannelB
            
            
                200