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>

我试过使用xmllinttidyxmllint正在缩进子元素,但不在新行中保留属性。另一方面,tidy可以选择在新行中保留属性,但不能缩进子元素。我也尝试过使用perlregex。这可能可以用XSLT来完成,但我不太熟悉它。

在我看来,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>

最新更新