前两天一个朋友去一家公司面试,面试题是用javascript解析一个XML,生成树形结构,今天闲着没事就试了试。
源代码:
- <html xmlns=" http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
<script language="javascript" charset="GB2312" type="text/javascript">
var xmlStr='<?xml version="1.0" encoding="utf-8"?><xmlRoot value="root"><child value="c1"><child_1>c11</child_1></child><child>c2</child></xmlRoot>';
var blank=". ";
var blankTimes=0;
var blankSize=20;
var idIndex=0;
function xmlParser(xmlStr)
{
var childs=null;
var root=null;
var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.loadXML(xmlStr);
root=xmlDoc.documentElement;
//childs=root.getChild
//alert(root.nodeName);
childs=root.childNodes;
//alert(document.body);
var topDiv=document.createElement("div");
document.body.appendChild(topDiv);
//alert(topDiv);
dealWithNode(root,0,topDiv);
}
function dealWithNode(node,blankTimes,container)
{
var children=null;
var childCount=0;
var isLeaf=false;
var htmlnode=null;
var textnode=null;
var bl_times=blankTimes;
var bl_str="";
var node_value="";
// for(var bl=0;bl<bl_times;bl++)
// {
// bl_str=bl_str+blank;
// }
if(node)
{
isLeaf=isLeafNode(node);
if(isLeaf)
{
if(node.nodeType==3)
{
node_value=node.nodeValue;
}
else
{
node_value=node.firstChild.nodeValue;
}
// htmlnode=document.createElement("span");
// textnode=document.createTextNode(bl_str+node_value);
// htmlnode.appendChild(textnode);
// document.body.appendChild(htmlnode);
// document.body.appendChild(document.createElement("<br>"));
//alert(container);
idIndex++;
htmlnode=createItem(node_value,"span"+idIndex,container);
htmlnode.style.paddingLeft=bl_times*blankSize;
//alert(node_value+"-"+bl_times);
//alert(node.firstChild.nodeValue);
}
else
{
node_value=getAttributValue(node,"value");
// htmlnode=document.createElement("span");
// textnode=document.createTextNode(bl_str+node_value);
// htmlnode.appendChild(textnode);
// document.body.appendChild(htmlnode);
// document.body.appendChild(document.createElement("<br>"));
idIndex++;
htmlnode=createItem(node_value,"span"+idIndex,container);
htmlnode.style.paddingLeft=bl_times*blankSize;
//alert(node_value+"-"+bl_times);
var cContainer=createChildContainer("div"+idIndex,container);
cContainer.style.paddingLeft=bl_times*blankSize;
Integration_InterceptCellEvent("span"+idIndex, "onclick", itemClick);
//htmlnode.onclick="itemClick('"+"div"+idIndex+"');";
//alert(htmlnode.onclick);
children=node.childNodes;
bl_times=1;
if(children&&children.length>0)
{
for(var i=0;i<children.length;i++)
{
dealWithNode(children[i],bl_times,cContainer);
}
}
}
}
}
//判断node节点是否是叶子节点
function isLeafNode(node)
{
var children=null;
if(node)
{
if(node.nodeType==3)
{
return true;
}
else
{
children=node.childNodes;
if(children.length==1&&children[0].nodeType==3)
{
return true;
}
else
{
return false;
}
}
}
return true;
}
//根据属性名 获取node节点的attrName属性的属性值
function getAttributValue(node,attrName)
{
var attributes=null;
var attr=null;
if(node)
{
attributes=node.attributes;
if(attributes&&attributes.length>0)
{
for(var attrI=0;attrI<attributes.length;attrI++)
{
attr=attributes[attrI];
if(attr&&attr.nodeName==attrName)
{
return attr.nodeValue;
}
}
}
}
return null;
}
//创建项
function createItem(itemText,idStr,parentContainer)
{
var htmlnode=null;
var textnode=null;
htmlnode=document.createElement("a");
htmlnode.id=idStr;
htmlnode.href="#";
//htmlnode.style.paddingLeft="200";
//htmlnode.expanded="fales";
textnode=document.createTextNode(itemText);
htmlnode.appendChild(textnode);
//alert(parentContainer);
parentContainer.appendChild(htmlnode);
parentContainer.appendChild(document.createElement("<br>"));
return htmlnode;
}
//创建非叶子节点的子节点的容器
function createChildContainer(idStr,parentContainer)
{
var cContainer=null;
cContainer=document.createElement("div");
cContainer.id=idStr;
cContainer.style.display="none";
parentContainer.appendChild(cContainer);
return cContainer;
}
//单击事件
function itemClick()
{
var conId=this.id.replace("span","div")
var container=document.getElementById(conId);
if(container)
{
if(container.style.display=="block")
container.style.display="none";
else
container.style.display="block";
}
//alert(conId);
}
function Integration_InterceptCellEvent(id, evt, func)
{
if (func.constructor == Function)
{
document.write('<scr' + 'ipt for="' + id + '" event="' + evt + '">'
+ 'Array.prototype.push.call(arguments, "' + evt + '");'
+ func.toString().match(//s*Function/s+(/S*)/s*/(/i)[1]
+ '.apply(this, arguments);'
+ '</sc' + 'ript>');
}
}
- </script>
</head>
<body>
<form id="form1" runat="server">
<div>
</div>
</form>
<script language="javascript">xmlParser(xmlStr);</script>
</body>
</html>
简单的实现了一下,有这个效果,有时间可以好好封装一下。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
相关推荐
JS读取XML字符串形成树
JS读取XML字符串形成树,针对数据量大的XML字符串读取与树结构拼接
VUE 扁平化数据结构转换为 el-tree 树结构数据 方法封装
【代码】VUE 扁平化数据结构转换为 el-tree 树结构数据 方法封装。
大白话系列:什么是微服务
用大白话和实际例子来通俗易懂地告诉你什么是微服务~
Vue基础知识总结 5:vue实现树形结构
一、前言 开发过程中,涉及到多级菜单的应用,树形结构比较常见,今天就做了一个Spring Boot + Vue + Element-UI 实现树形结构的一个小demo。 Tree组件最适合的结构是无序列列表ul,创建一个递归组件Item表示Tree选项,如果当前Item存在 children,则递归渲染子树,以此类推;同时添加一个标识管理理当前层级item的展开状态。 效果展示: 二、代码实例 1、数据库设计 2、实体类 一般树形结构都是创建若干层实体类,然后通过list结合在一起,面
Cadence PCB SI仿真实战:如何手动添加VIA过孔模型提升板级链路精度
本文详细介绍了在Cadence PCB SI仿真中如何手动添加VIA过孔模型以提升DDR4/5设计的精度。通过参数化建模和三维全波建模技术,工程师可以有效解决高速设计中的信号完整性问题,显著降低仿真误差。文章还提供了实战案例和常见问题解决方案,帮助优化板级链路性能。
【DRAM存储器五十五】LPDDR5介绍--command bus training
本文详细介绍了LPDDR5命令总线训练(CBT)的两种模式操作流程。在启用ODT进行高频/中频操作前,必须对命令总线进行训练,包括调整VREF(CA)电压和CA/CS信号时序。两种模式的主要区别在于VREF(CA)设置方式:模式1通过MR12直接设置,模式2通过DMI[0]引脚捕获DQ[6:0]数据更新MR12。训练流程涉及频率切换、模式寄存器配置、pattern发送及结果采样等步骤,最终确定最佳VREF(CA)和时序参数。文章还分析了不同PHY实现可能存在的差异,如训练pattern生成方式和采样次数等。
Vue实战(三):实现树形表格
实现树形表格
华为MetaERP PTP采购到应付全流程解析
摘要:本文系统解析华为MetaERP中的PTP(采购到应付)全流程管理方案,涵盖从采购申请到付款执行的完整业务流程。文章详细分解了PR、PO、GR、IV、AP等关键环节的财务核算规则,并提供了预算校验、库存更新等Python代码示例。同时阐述了IT落地架构设计,包括会计引擎配置、系统集成方案及银企直连支付接口实现。该方案通过三单匹配自动化和智能会计引擎,将处理效率提升10倍(200笔/人天→2000笔/人天),实现98%的自动化率,为集团企业提供了高效的数字化财务管理样板。文中所有技术方案均需根据实际场景调
新作,将平行结构XML转化为树形XML结构,递归
转换的PHP代码如下 header("Content-type:text/xml;charset=utf-8"); function getRootPath(){ $biasNum = substr_count($_SERVER['PHP_SELF'], '/'); //用'/'分割当前路径字符串,并计算分割后的字符串数量 $relativePath = './'; //初始化变量$re...
机器学习项目实战案例数据集
本专栏整理了《机器学习项目实战案例》,内包含了各种不同的机器学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。
RK3568平台开发系列讲解:内核启动流程
第 493 行的 ENTRY 指明了了 Linux 内核入口,入口为stext,stext 定义在文件arch/arm/kernel/head.S 中 , 因此要分析Linux 内核的启动流程,就得先从文件arch/arm/kernel/head.S 的 stext 处开始分析。_mmap_switched 定义在文件 arch/arm/kernel/head-common.S,__mmap_switched 最终会调用 start_kernel 函数。⑥、r2=atags 或者设备树(dtb)首地址。
前端开发笔记:Vue将后端传来数据转换为树,并显示在el-tree上
在页面加载时,从后端接收到一个复杂的树形结构,要从中提取出节点,创建新的树,符合el-tree的data属性格式,并显示出来。
Auto.js实现视频号点赞自动化
摘要:本文介绍了一个微信视频号自动化点赞的实现方案。通过定位点赞图标和数量容器,点击点赞按钮后检测点赞数变化,若发现取消点赞则自动补点。核心代码包括:1)获取点赞容器和图标;2)记录点赞前后数量;3)判断是否误取消并补点;4)循环执行点赞和滑动页面操作。该方案解决了滑动页面可能导致误取消点赞的问题,实现了自动化批量点赞功能。文章强调仅供学习参考,提醒勿滥用该技术。
javascript解析XML生成树形结构(兼容Firefox,IE9)
直接将源代码拷贝过来了 无标题页 var xmlStr='c11c2'; var blank=". "; var blankTimes=1; var blankSize=40; var idIndex=0; //兼容IE和Firefox的XM
老版QQ原生表情gif动态
这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。
VC中sqlite的使用
在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示
JS读取XML字符串生成树结构
根据上篇文章整理出本人所需的JS读取XML字符串生成树,这是我自己根据上面文章所说的JS文件修改的,作为存档记录,所以不做详细介绍了。////JS代码function caret(xmls) { document.write(''); // 输出一个div层用来放菜单 document.write(''); document
IEM模型,地表粗糙度模拟
利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟
JS高效解析XML字符串生成树结构
本文介绍了一种基于JavaScript的XML字符串解析方案,通过分块处理和定时器优化实现大数据量下树形结构的顺畅加载。代码兼容主流浏览器,支持节点搜索与展开功能,提升用户交互体验。
Statistics and Machine Learning Toolbox
Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具
javascript 读取xml 数据
首先:xml文件(tree.xml)内容如下: [code="java"] 山东省 _blank 省份 威海市 _blank 城市 烟台市 _blank 城市 长夼村 _blank 乡镇 http://www.baidu.com/ 富镇 _blank 乡镇 ...
javascript读取xml数据(转)
在网上找到一篇javascript读取xml数据很详细的文章,特转到自己博客中,一来同大家分享,二来留作资料参考!.......... /////////////////////////////////////////// 首先:xml文件(tree.xml)内容如下: <?xml version="1.0" encoding="gb2312"?> <treeview> &...
java script 读取xml (转贴)
首先:xml文件(tree.xml)内容如下: [code="java"] 山东省 _blank 省份 威海市 _blank 城市 烟台市 _blank 城市 长夼村 _blank 乡镇 http://www.baidu.com/ 富镇 _blank 乡镇 ...
Node中使用JSZip和fast-xml-parser实现XMind 转 Markdown
本文介绍了如何使用Node.js中的JSZip和fast-xml-parser库将XMind思维导图文件转换为Markdown格式。主要内容包括: 工具概述:说明该工具能将.xmind文件批量转换为.md文件,并提取内嵌图片到images目录。 实现原理: XMind文件本质是ZIP压缩包 content.xml存储了思维导图的树形结构 详细说明了XML到Markdown的映射规则 技术栈:使用JSZip处理压缩包,fast-xml-parser解析XML,Node.js内置fs/path模块进行文件操作。
DOM 是个什么东西?就是HTML的文件夹结构?
不是一个“文件夹结构”,而是浏览器在内存里把 HTML/XML 文档解析后生成的一种。DOM = 按照设计图建出来的“房子模型”,你可以进去随便改(加个房间,换个窗户)。是浏览器根据这份代码在内存中创建出来的“数据结构”。,JavaScript 能通过 DOM API(比如。HTML 文件 = 房子的设计图。等)去访问和修改页面内容。文本、属性等也会成为节点。差不多,但不完全是 🙂。就像是一份“源代码”。
1168



被折叠的 条评论
为什么被折叠?



