Как преобразовать записи в файле .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>
Другие вопросы по тегам