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:
- Đọc tệp của bạn bằng trình phân tích cú pháp để giữ bình luận
- Chèn nhận xét bằng cách sử dụng
0def 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?
- Vòng lặp qua danh sách từ điển và thêm các phần tử phụ vào XML
- Sử dụng
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ếtdef 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?
- Xóa các dòng mới bằng cách sử dụng danh sách hiểu và
2def 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?
- Thêm thông tin mã hóa vào khai báo XML
- 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