使用toprettyxml制作Xml

时间:2016-04-01 12:27:48

标签: python xml

我使用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(newLine)的内容,但即使我更改了缩进和新参数,它看起来也是第一个解决方案的时间...

最诚挚的问候 嘉

1 个答案:

答案 0 :(得分:1)

toprettyxml功能不支持,但您可以使用此功能获得所需内容:

overflow:auto

您将得到您所需要的一切。

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

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