【问题标题】:How to print pretty xml in javascript?如何在javascript中打印漂亮的xml?
【发布时间】:2010-11-14 07:40:08
【问题描述】:

在 JavaScript 中漂亮打印 xml 的最佳方法是什么?我通过 ajax 调用获取 xml 内容,在 textarea 中显示此请求之前,我想对其进行格式化,使其看起来不错:)

【问题讨论】:

标签: javascript xml pretty-print


【解决方案1】:

这不是最好的方法,但是您可以将 xml 作为文本并使用 RegExp 根据节点和断线的深度查找并用制表符替换“>”,但我不太了解 RegExp好吧,对不起。

您还可以使用 XSLT 并使用 javascript 对其进行转换。
查看this link 并查看this tutorial

【讨论】:

    【解决方案2】:

    这不会处理任何缩进,但有助于对 XML 进行编码以在 <pre><textarea> 标签中使用:

    /* hack to encode HTML entities */
    var d = document.createElement('div'); 
    var t = document.createTextNode(myXml); 
    d.appendChild(t);
    document.write('<pre>' + d.innerHTML + '</pre>');
    

    如果您想要突出显示而不是 &lt;textarea&gt;,并且节点是可折叠/可展开的,那么请参阅超级用户上的 Displaying XML in Chrome Browser

    【讨论】:

      【解决方案3】:

      我同意 Arjan 关于使用 &lt;pre&gt; 标签的观点。在大约 2 天前尝试之前,我试图在我的 html 输出中破译“丑陋”的 xml 代码。让生活更轻松,让你保持清醒。

      【讨论】:

      • 好吧,我不确定即使是评论,我们也不能没有答案,但是好吧......现在删除它也可能会清除upvote,所以等到你至少获得 60 声望。 :-)
      • 现在几年过去了,我想应该删除它了 ;-) (考虑到它的年龄,如果我理解正确的话,你将保持声誉。)
      【解决方案4】:

      使用 prettydiff.com/markup_beauty.js。这能够支持无效的标记、片段和 JSTL 代码。

      <c:out value="<strong>text</strong>"/>
      

      您可以使用prettydiff.com 的网络工具演示该应用程序。只需选择“美化”和“标记”选项即可。

      使用合适的工具来美化您的 XML 很重要,不要随意操之过急。否则,您将在它们不打算的地方添加空白标记,并在它们打算的地方删除它们。对于原始数据,这可能是必然的,但对于人类可消费的内容,这会破坏代码的完整性,尤其是在递归方面。

      【讨论】:

        【解决方案5】:

        看看 vkBeautify.js 插件

        http://www.eslinstructor.net/vkbeautify/

        这正是您所需要的。 它是用纯 javascript 编写的,小于 1.5K 并且速度非常快:不到 5 毫秒。处理 50K XML 文本。

        【讨论】:

        【解决方案6】:

        这是一个小型的自包含美化器,适用于大多数情况,可以很好地缩进长行并在需要时为输出着色。

        function formatXml(xml,colorize,indent) { 
          function esc(s){return s.replace(/[-\/&<> ]/g,function(c){         // Escape special chars
            return c==' '?'&nbsp;':'&#'+c.charCodeAt(0)+';';});}            
          var sm='<div class="xmt">',se='<div class="xel">',sd='<div class="xdt">',
              sa='<div class="xat">',tb='<div class="xtb">',tc='<div class="xtc">',
              ind=indent||'  ',sz='</div>',tz='</div>',re='',is='',ib,ob,at,i;
          if (!colorize) sm=se=sd=sa=sz='';   
          xml.match(/(?<=<).*(?=>)|$/s)[0].split(/>\s*</).forEach(function(nd){
            ob=('<'+nd+'>').match(/^(<[!?\/]?)(.*?)([?\/]?>)$/s);             // Split outer brackets
            ib=ob[2].match(/^(.*?)>(.*)<\/(.*)$/s)||['',ob[2],''];            // Split inner brackets 
            at=ib[1].match(/^--.*--$|=|('|").*?\1|[^\t\n\f \/>"'=]+/g)||['']; // Split attributes
            if (ob[1]=='</') is=is.substring(ind.length);                     // Decrease indent
            re+=tb+tc+esc(is)+tz+tc+sm+esc(ob[1])+sz+se+esc(at[0])+sz;
            for (i=1;i<at.length;i++) re+=(at[i]=="="?sm+"="+sz+sd+esc(at[++i]):sa+' '+at[i])+sz;
            re+=ib[2]?sm+esc('>')+sz+sd+esc(ib[2])+sz+sm+esc('</')+sz+se+ib[3]+sz:'';
            re+=sm+esc(ob[3])+sz+tz+tz;
            if (ob[1]+ob[3]+ib[2]=='<>') is+=ind;                             // Increase indent
          });
          return re;
        }
        

        演示见https://jsfiddle.net/dkb0La16/

        【讨论】:

        • 不错。为什么使用 id= 而不是 class=?此代码生成具有相同 id 的多个元素。
        • 感谢您的反馈。在最初的帖子中完全搞砸了代码/链接。固定。
        • 我还添加了“s”标志。我的一些 XML 文件包含换行符。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
        • 有点困惑..你在编码中的哪里添加了标志?
        • 我在所有三个 match() 常规抑制的末尾添加了一个“s”。 (不是 split() 或 replace()。)它可能需要更少的时间,我没有尝试所有的组合。这很容易测试。在文件中的每个“>”之后添加一个换行符。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-19
        • 2023-03-07
        • 2010-09-13
        • 1970-01-01
        相关资源
        最近更新 更多