-1

我已经使用 Python 以 txt 文件中显示的格式从 dbc 中获取了所有消息名称和信号名称:

MessageName1
Signal_Name1

MessageName2
Signal_Name2
Signal_Name3

MessageName3
Signal_Name4
Signal_Name5
Signal_Name6

每条消息都由空格分隔,如上所示。谁能解释一下如何使用 Python 中的元素树生成以下格式的 XML 文件?

<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>

等等。

4

1 回答 1

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>
于 2020-11-09T17:22:23.020 回答