2011-05-22 86 views
3

我正在使用HaXml來轉換XML文件,它都很好地工作。然而,輸出HaXml產生的外觀真的很難看,主要是因爲它幾乎在每個右括號處插入一個換行符。 下面是一些代碼,生成一個xml:醜陋的XML輸出

writeFile outPath (show . PP.content . head $ test (docContent (posInNewCxt "" Nothing) (xmlParse "" ""))) 

test = 
    mkElemAttr "test" [("a", literal "1"), ("b", literal "2")] 
     [ 
      mkElem "nested" [] 
     ] 

,這裏是它的輸出:

<test a="1" b="2" 
    ><nested/></test> 

當然是有更多的元素變得更糟。

我知道的HaXml使用Text.PrettyPrint.HughesPJ進行渲染,但使用不同的styles 並沒有太大變化。

那麼,有沒有辦法改變輸出?

回答

3

更換你打電話showText.PrettyPrint.renderStyle你可以得到一些不同的行爲:

默認樣式

<test a="1" b="2" 
    ><nested/></test> 

import Text.XML.HaXml 
import Text.XML.HaXml.Util 
import Text.XML.HaXml.Posn 
import qualified Text.XML.HaXml.Pretty as PP 
import Text.PrettyPrint 

main = writeFile "/tmp/x.xml" (renderStyle s . PP.content 
              . head $ 
       test (docContent (posInNewCxt "" Nothing) (xmlParse "" ""))) 
    where 
     s = style { mode = LeftMode, lineLength = 2 } 

test = 
    mkElemAttr "test" [("a", literal "1"), ("b", literal "2")] 
     [ 
      mkElem "nested" [] 
     ] 

不同出的現成的款式做實驗

style {mode = OneLineMode}

<test a="1" b="2" ><nested/></test> 

風格{模式= LeftMode,線路長度= 2}

<test a="1" 
b="2" 
><nested/></test> 

所以你當然可以做一些不同的事情。

如果你不喜歡任何這些,你可以寫一個自定義的處理器,使用fullRender

fullRender 
    :: Mode      -- Rendering mode 
    -> Int      -- Line length 
    -> Float     -- Ribbons per line 
    -> (TextDetails -> a -> a) -- What to do with text 
    -> a      -- What to do at the end 
    -> Doc      -- The document 
    -> a      -- Result 

在您自定義的行爲可以被編程到TextDetails功能。

+0

恩,我想我必須寫自己的fullRender,或者乾脆結果。也許我會嘗試複製現有的默認樣式並刪除換行符。 – bzn 2011-05-22 19:21:08