我有一个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>
我试过使用xmllint
和tidy
。xmllint
正在缩进子元素,但不在新行中保留属性。另一方面,tidy
可以选择在新行中保留属性,但不能缩进子元素。我也尝试过使用perlregex。这可能可以用XSLT来完成,但我不太熟悉它。
在我看来,XML::Twig
的xml_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>