我有一个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
另一方面,可以选择将属性保留在新行中,但无法缩进子元素。我也试过使用perl regex。这可能是用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>