使用toprettyxm生成Xml

2024-06-26 18:31:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Python创建一个XML文件。 我的代码是:

rough_string = ET.tostring(CanDef, 'utf-8') #CanDef is my main Element
reparsed = minidom.parseString(rough_string)
XmlFile = reparsed.toprettyxml()

我得到的代码是:

<CanDef>
  <CanDB>
    <Msg CallBack="NULL" Can="0" DLC="3" Dir="tx" ID="273" MsgName="Frm0x111">
        <Signal Can="0" Dir="tx" Len="8" Max="1" Min="-1" MsgName="Frm0x111" Offset="1" Pos="1" Reso="127.5" SigName="myCos"/>
        <Signal Can="0" Dir="tx" Len="8" Max="1" Min="-1" MsgName="Frm0x111" Offset="1" Pos="2" Reso="127.5" SigName="mySin"/>
        <Signal Can="0" Dir="tx" Len="8" Max="255" Min="0" MsgName="Frm0x111" Offset="0" Pos="3" Reso="1" SigName="myAdd"/>
    </Msg>
</CanDB>

我想要的是:

    <?xml version="1.0"?>
<CanDef>
    <CanDB>
        <Msg
          Can="0" 
          MsgName="Frm0x111"
          ID="273"
          Dir="tx"
          DLC="3"
          CallBack="NULL"
        >
            <Signal
                Can="0"
                MsgName="Frm0x111"
                Dir="tx"
                SigName="MyCos"
                Pos="1"
                Len="8"
                Min="-1"
                Max="1"
                Offset="1"
                Reso="127.5"
            />
            <Signal
                Can="0"
                MsgName="Frm0x111"
                Dir="tx"
                SigName="MySin"
                Pos="2"
                Len="8"
                Min="-1"
                Max="1"
                Offset="1"
                Reso="127.5"
            />
            <Signal
                Can="0"
                MsgName="Frm0x111"
                Dir="tx"
                SigName="MyAdd"
                Pos="3"
                Len="8"
                Min="0"
                Max="255"
                Offset="0"
                Reso="1"
            />
        </Msg>
</CanDef>
</CanDB>

有没有可能用toprettyxml得到第二个解? 因为我发现了一些关于indentnewl(换行符)的东西,但它看起来像是每次第一个解决方案,即使我更改indent和newl参数。。。你知道吗

致以最诚挚的问候 卡


Tags: possignallendirmincanmaxoffset
1条回答
网友
1楼 · 发布于 2024-06-26 18:31:11

toprettyxml函数不支持此功能,但您可以使用此函数实现所需的功能:

import re

def toevenprettierxml(xml, indent = '  ', newl = '\n'):
   for ind, element in re.findall(r'^(\s*)(\<\w+\s+.+\>)', xml, re.MULTILINE):
      even_prettier_element = re.sub(r'\s+', newl + ind + indent, element)
      even_prettier_element = re.sub(r'(/?\>)', newl + ind + r'\1', even_prettier_element)
      xml = xml.replace(element, even_prettier_element)
   return xml

你会得到你所需要的。你知道吗

如果未设置xml格式,另一个选项是用元素替换属性,例如:

<Msg>
  <Can>0</Can>
  <MsgName>Frm0x111</MsgName>
  ...
</Msg>

相关问题 更多 >