Как преобразовать записи в файле .txt в XML
Я получил все имена сообщений и имена сигналов из dbc, используя Python в формате, показанном ниже в текстовом файле:
MessageName1
Signal_Name1
MessageName2
Signal_Name2
Signal_Name3
MessageName3
Signal_Name4
Signal_Name5
Signal_Name6
Каждое сообщение разделено пробелом, как показано выше. Может ли кто-нибудь объяснить, как создать XML-файл в формате ниже, используя дерево элементов в Python?
<namespace name="MessageName1" comment="" interface="">
<variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="Signal_Name1" comment="" bitcount="64" isSigned="true" encoding="65001" type="float" />
</namespace>
<namespace name="MessageName2" comment="" interface="">
<variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="Signal_Name2" comment="" bitcount="64" isSigned="true" encoding="65001" type="float" />
<variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="Signal_Name3" comment="" bitcount="64" isSigned="true" encoding="65001" type="float" />
</namespace>
и так далее.
1 ответ
Я бы предложил что-то в этом роде. Обратите внимание, что для простоты я удалил все ненужные атрибуты. Очевидно, вы можете добавить их обратно в код.
from lxml import etree
import copy
messages = """[your messages above]"""
blocks = messages.split('\n\n')
lines = [block.split('\n') for block in blocks]
template = """
<root>
<namespace name="MessageName">
<variable name="Signal_Name"/>
</namespace>
</root>
"""
doc = etree.XML(template)
final_doc = etree.XML('<root></root>')
ns_source = doc.xpath('/root/namespace')[0]
var_source = doc.xpath('//variable')[0]
destination = final_doc.xpath('/root')[0]
for line in lines:
new_ns = copy.copy(ns_source)
new_ns.remove(new_ns.xpath('./variable')[0])
new_ns.attrib['name']= line[0]
for signal in line[1:]:
new_varname = copy.copy(var_source)
new_varname.attrib['name']=signal
new_ns.append(new_varname)
destination.append(new_ns)
print(etree.tostring(final_doc).decode())
Вывод:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<namespace name="MessageName1">
<variable name="Signal_Name1" />
</namespace>
<namespace name="MessageName2">
<variable name="Signal_Name2" />
<variable name="Signal_Name3" />
</namespace>
<namespace name="MessageName3">
<variable name="Signal_Name4" />
<variable name="Signal_Name5" />
<variable name="Signal_Name6" />
</namespace>
</root>