2016-04-01 4 views
0

私はPythonを使ってXMLファイルを作成します。toprettyxmlで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を使用して2番目のソリューションを取得しますか? 私は何かについてindentnewl(改行)を見つけたが、それは私がインデントとNEWL引数を変更した場合でも、第一の溶液のエヴリーの時間のように見える...

よろしく のKa

答えて

1

それは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> 
+0

おかげでたくさんの男、要素と属性を置き換えることです! – KaClipse