我有一个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 regex。这可能是用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>

08-27 14:46