如何在javascript中打印漂亮的xml?

时间:2009-07-27 10:22:46

标签: javascript xml pretty-print

在JavaScript中打印xml的最佳方法是什么?我通过ajax调用获取xml内容,然后在textarea中显示此请求之前我想格式化它以使它看起来很好看:)

6 个答案:

答案 0 :(得分:5)

这不会处理任何缩进,但有助于对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>');

如果您需要突出显示并且节点可折叠/展开,而不是<textarea>,请在超级用户上查看Displaying XML in Chrome Browser

答案 1 :(得分:5)

看一下 vkBeautify.js 插件

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

这正是你所需要的。 它用简单的javascript编写,小于1.5K缩小并且非常快:花费不到5毫秒。处理50K XML文本。

答案 2 :(得分:2)

我同意Arjan使用<pre>标签。我试图在我的html输出中破译'丑陋的'xml代码,然后我在大约2天前尝试了这个。让生活更轻松,让您保持理智。

答案 3 :(得分:1)

这不是最好的方法,但你可以将xml作为文本并使用RegExp来查找和替换'&gt;'对于根据节点深度和断裂线的标签,但我真的不太了解RegExp,对不起。

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

答案 4 :(得分:1)

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

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

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

使用适当的工具来美化XML并且不要随意匆忙地完成工作是很重要的。否则,您将添加不在意图的空白标记,并将其移除到预期位置。对于原始数据,这可能是重要的,但对于人类可消费内容,这会破坏代码的完整性,尤其是在递归方面。

答案 5 :(得分:1)

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

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 id="xmt">',se='<div id="xel">',sd='<div id="xdt">',
      sa='<div id="xat">',tb='<div id="xtb">',tc='<div id="xtc">',
      id=indent||'  ',sz=tz='</div>',re=is='',ib,ob,at,i;
  if (!colorize) sm=se=sd=sa=sz='';   
  xml.slice(1,-1).split(/>\s*</).forEach(function(nd){
    ob=('<'+nd+'>').match(/^(<[!?\/]?)(.*?)([?\/]?>)$/);              // Split outer brackets
    ib=ob[2].match(/^(.*?)>(.*)<\/(.*)$/)||['',ob[2],''];             // Split inner brackets 
    at=ib[1].match(/^--.*--$|=|('|").*?\1|[^\t\n\f \/>"'=]+/g)||['']; // Split attributes
    if (ob[1]=='</') is=is.substring(id.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+=id;                              // Increase indent
  });
  return re;
}

演示见https://jsfiddle.net/3n0cazL8/