2016-04-01 11 views
0

Ich benutze Python, um eine XML Datei zu erstellen. Mein Code ist:Make Xml mit toprettyxml

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

Und was ich mit diesem Code erhalten ist:

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

Und was ich haben will ist:

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

Ist es möglich, um die zweite Lösung mit toprettyxml zu bekommen? Weil ich etwas über indent und newl (newLine) gefunden, aber es sieht aus wie die erste Lösung Evry Zeit, auch wenn ich indent ändern und newl Argumente ...

Mit freundlichen Grüßen Ka

Antwort

1

Es ist nicht von toprettyxml unterstützt Funktion, aber Sie können mit dieser Funktion erreichen, was Sie wollen:

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 

Sie erhalten genau das, was Sie brauchen.

Eine weitere Option, wenn das XML-Format nicht gesetzt ist, ist Attribute mit Elementen zu ersetzen, z.B .:

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

Vielen Dank Mann! – KaClipse