在 JavaScript 中漂亮打印 xml 的最佳方法是什么?我通过 ajax 调用获取 xml 内容,在 textarea 中显示此请求之前,我想对其进行格式化,使其看起来不错:)
6 回答
看看vkBeautify.js插件
http://www.eslinstructor.net/vkbeautify/
这正是您所需要的。它是用纯 javascript 编写的,小于 1.5K 并且速度非常快:不到 5 毫秒。处理 50K XML 文本。
这不考虑任何缩进,但有助于对 XML 进行编码以在<pre>
or<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>
您希望突出显示而不是 ,并且节点是可折叠/可展开的,请参阅在超级用户的 Chrome 浏览器中显示 XML 。
我同意 Arjan 关于使用<pre>
标签的观点。在大约 2 天前尝试之前,我试图在我的 html 输出中破译“丑陋”的 xml 代码。让生活更轻松,让你保持清醒。
这是一个小型的自包含美化器,适用于大多数情况,可以很好地缩进长行,并在需要时对输出进行着色。
function formatXml(xml,colorize,indent) {
function esc(s){return s.replace(/[-\/&<> ]/g,function(c){ // Escape special chars
return c==' '?' ':'&#'+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;
}
使用 prettydiff.com/markup_beauty.js。这能够支持无效标记、片段和 JSTL 代码。
<c:out value="<strong>text</strong>"/>
您可以使用prettydiff.com上的 Web 工具演示该应用程序。只需选择“美化”和“标记”选项。
使用适当的工具来美化 XML 并且不要随意操之过急,这一点很重要。否则,您将在它们不打算的地方添加空白标记,并在它们打算的地方删除它们。对于原始数据,这可能是重要的,但对于人类可消费的内容,这会破坏代码的完整性,尤其是在递归方面。