CLI工具格式化XML文件,保留空行和注释

时间:2019-01-01 20:44:38

标签: xml linux format command-line-interface pretty-print

是否有用于Linux的CLI工具,用于格式化XML文件并保留任何空行和注释?我已经尝试过xmllint,tidy和xmlstarlet,但是它们似乎都集中在完全清除XML文件上,而不仅仅是缩进和间隔。

1 个答案:

答案 0 :(得分:2)

尝试xmlindent。它有多个选项,例如-nbe-nba,还有其他一些选项可以配置前后的空格处理。

给出XML输入

<?xml version="1.0"?>
<Response>
  <TroubleResponse>
    <Check>
      <DStatus>
        <GID>123456789</GID>
        <FLAG/>
      </DStatus>
    </Check>
    <RAM>
      <Details>
        <RAMID>5555777788
        </RAMID>
      </Details>
    </RAM>
    <RAM>
      <Details>
        <RAMID>
            5555777788</RAMID>
      </Details>
    </RAM>
  </TroubleResponse>
</Response>

可以使用以下选项(摘录)配置输出:

-t     Use tabs instead of spaces
-nas   Suppress newline after start-tag
-nae   Suppress newline after end-tag
-nbs   Suppress newline before start-tag
-nbe   Suppress newline before end-tag
-f     Force newline on elements without children

因此xmlindent -fxmlindent -nba将产生以下输出:

<?xml version="1.0"?>
<Response>
    <TroubleResponse>
        <Check>
            <DStatus>
                <GID>123456789       <!-- Change -->
                </GID>
                <FLAG/>
            </DStatus>
        </Check>
        <RAM>
            <Details>
                <RAMID>5555777788
                </RAMID>
            </Details>
        </RAM>
        <RAM>
            <Details>
                <RAMID>             <!-- Change -->
                    5555777788
                </RAMID>
            </Details>
        </RAM>
    </TroubleResponse>
</Response>

xmlindent -nbe将产生以下输出:

<?xml version="1.0"?>
<Response>
    <TroubleResponse>
        <Check>
            <DStatus>
                <GID>123456789</GID>
                <FLAG/>
            </DStatus>
        </Check>
        <RAM>
            <Details>
                <RAMID>5555777788
                </RAMID>
            </Details>
        </RAM>
        <RAM>
            <Details>
                <RAMID>                  <!-- Change -->
                5555777788</RAMID>
            </Details>
        </RAM>
    </TroubleResponse>
</Response>

xmlindent并不完美,因为它似乎并不总是能够实现预期的结果,但是可以对其进行一些配置。