1. ホーム
  2. javascript

[解決済み] javascriptでXMLをきれいに印刷する

2022-05-05 03:40:08

質問

インデントされていないXMLを表す文字列があり、それをプリティプリントしたいのですが、どうすればよいでしょうか?例えば

<root><node/></root>

になるはずです。

<root>
  <node/>
</root>

シンタックスハイライトは必須ではありません。この問題に取り組むために、私はまずXMLを変換してキャリッジリターンとホワイトスペースを追加し、その後に プリ タグを使用してXMLを出力します。改行や空白を追加するために、以下のような関数を書きました。

function formatXml(xml) {
    var formatted = '';
    var reg = /(>)(<)(\/*)/g;
    xml = xml.replace(reg, '$1\r\n$2$3');
    var pad = 0;
    jQuery.each(xml.split('\r\n'), function(index, node) {
        var indent = 0;
        if (node.match( /.+<\/\w[^>]*>$/ )) {
            indent = 0;
        } else if (node.match( /^<\/\w/ )) {
            if (pad != 0) {
                pad -= 1;
            }
        } else if (node.match( /^<\w[^>]*[^\/]>.*$/ )) {
            indent = 1;
        } else {
            indent = 0;
        }

        var padding = '';
        for (var i = 0; i < pad; i++) {
            padding += '  ';
        }

        formatted += padding + node + '\r\n';
        pad += indent;
    });

    return formatted;
}

そして、このような関数を呼び出す。

jQuery('pre.formatted-xml').text(formatXml('<root><node1/></root>'));

これは私にとっては完全にうまくいくのですが、前の関数を書いているときに、もっといい方法があるに違いないと思いました。そこで質問なのですが、XMLの文字列を与えて、それをhtmlページにきれいに印刷する良い方法をご存知でしょうか?この仕事をすることができる任意のjavascriptフレームワークやプラグインは歓迎されます。私の唯一の要件は、これがクライアント側で実行されることです。

解決するには?

質問文より 文字列の結果が期待されているような印象を受けます。 HTML フォーマットの結果とは対照的です。

もしそうであれば これを実現する最も簡単な方法は、XMLドキュメントを アイデンティティ変換 で、かつ <xsl:output indent="yes"/> インストラクション :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

    <xsl:template match="node()|@*">
      <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

提供されたXML文書にこの変換を適用する場合。

<root><node/></root>

ほとんどの XSLT プロセッサー (.NET XslCompiledTransform、Saxon 6.5.4 および Saxon 9.0.0.2, AltovaXML) は望みの結果を生成します。

<root>
  <node />
</root>