2013-06-27 46 views
3

我有一個xml如下。xml:如何縮進子元素,但保留新行上的屬性

<!DOCTYPE parent [ 
<!ENTITY entity1 "value"> 
]> 
<main> 
<parent attr1="str1" 
     attr2="str2"> 
<child childattr1="str3" 
     childattr2="&entity1;" /> 
<child childattr1="str4" 
     childattr2="&entity1;" /> 
</parent> 
</main> 

我需要縮進子元素,留下,因爲它是XML文件的其餘部分(即在DTD部分和實體不應該被刪除,屬性應該是新線)。該XML應該終於看起來像:

<!DOCTYPE parent [ 
<!ENTITY entity1 "value"> 
]> 
<main> 
    <parent attr1="str1" 
      attr2="str2"> 
     <child childattr1="str3" 
       childattr2="&entity1;" /> 
     <child childattr1="str4" 
       childattr2="&entity1;" /> 
    </parent> 
</main> 

我一直在使用xmllinttidy嘗試。 xmllint是縮進子元素,但它不保留新行中的屬性。另一方面,tidy有一個選項可將屬性保留爲新行,但無法縮進子元素。我也嘗試使用perl正則表達式。這可能可以用XSLT來完成,但我不太熟悉它。

+4

很少XML處理器將維持屬性間的佈局,因爲空白有微不足道。您可能需要編寫自定義格式化程序。 – Borodin

+0

我想縮進子元素,因爲它更易於理解,並且將屬性放在新行中對版本控制友好。 –

回答

4

在我看來,XML::Twigxml_pp實用,你想要做其indented_a選項幾乎什麼:

$ xml_pp -s indented_a foo.xml 
<!DOCTYPE parent [ 
<!ENTITY entity1 "value"> 
]> 
<main> 
    <parent 
     attr1="str1" 
     attr2="str2"> 
    <child 
     childattr1="str3" 
     childattr2="&entity1;" 
    /> 
    <child 
     childattr1="str4" 
     childattr2="&entity1;" 
    /> 
    </parent> 
</main> 
+0

似乎在做詭計!謝謝。 –

相關問題