xml:如何缩进子元素但保留新行的属性

时间:2013-06-27 12:52:15

标签: xml perl xslt tidy xmllint

我有一个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>

我尝试过使用xmllinttidyxmllint缩进子元素,但不保留新行中的属性。另一方面,tidy可以选择将属性保留在新行中,但不能缩进子元素。我也尝试过使用perl正则表达式。这可能是用XSLT完成的,但我并不熟悉它。

1 个答案:

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