Javascript 递归xml解析函数未按预期工作
我试图解析一个XML文档,并使用该数据构建一个(更简单的)json对象,其形式如下:Javascript 递归xml解析函数未按预期工作,javascript,node.js,xml,recursion,xml-parsing,Javascript,Node.js,Xml,Recursion,Xml Parsing,我试图解析一个XML文档,并使用该数据构建一个(更简单的)json对象,其形式如下: {id: '1', name: 'content-types', children: [{id: '2', name: 'requirements': children: [... and so on ...]]} 我的XML有如下节点(我只包括一个——它们可以任意嵌套): 目前,此函数生成类似于我提到的JSON格式的内容,但缺少许多节点 而且,我的递归函数似乎不是在最简单的情况下终止的,因为它沿着xml树的
{id: '1', name: 'content-types', children: [{id: '2', name: 'requirements': children: [... and so on ...]]}
我的XML有如下节点(我只包括一个——它们可以任意嵌套):
目前,此函数生成类似于我提到的JSON格式的内容,但缺少许多节点
而且,我的递归函数似乎不是在最简单的情况下终止的,因为它沿着xml树的更深层分支递归。我在控制台中记录了以下内容(例如),但没有191度深的节点:
191
parser.js?d3c4:83 //*[@class='taxonomies']/*[@class='taxonomy']/*[@class='concepts']/*[@class='concept']/*[@class='concepts']/*[@class='concept']/*[@class='concepts']/*[@class='concept']/*[@class='concepts']/*[@class='concept']/*[@class='concepts']/*[@class='concept']/*[@class='concepts']/*[@class='concept']/*[@class='concepts']/*[@class='concept']/*[@class='concepts']/*[@class='concept']/*[@class='concepts']/*[@class='concept']/*[@class='concepts']/*[@class='concept']/*[@class='concepts']/*[@class='concept']/*[@class='concepts']/*[@class='concept']/*[@class='concepts']/*[@class='concept']/*[@class='concepts']/*[@class='concept']/*[@class='concepts']
parser.js?d3c4:92 child is:
有人能帮我找出如何更改此函数以使其获得所需的数据吗?我可能错过了一些要求,但一旦您停止循环所有元素并开始查询您期望的确切元素,问题似乎就不那么复杂了:
//将xml字符串解析为文档
const parser=new DOMParser();
const xmlDoc=parser.parseFromString(
getXML(),
“文本/xml”
);
//从xml元素到对象的主要逻辑
const parseTaxonomy=(taxonomy,id=1)=>({
身份证件
名称:taxonomy.querySelector(“.name”)
.innerText
.toLowerCase()
.替换(/\s/g,“-”),
子项:Array.from(
(分类法.querySelector(“.concepts”)| |{子项:[]})
儿童
).map(t=>parseTaxonomy(t,++id))//注意++
});
//运行第一个分类法
//如果顶层包含多个元素,请使用.map
console.log(
语法分类学(
xmlDoc.querySelector(“分类法”)
)
);
//数据
函数getXML(){
返回`
3484069771
内容类型
EN
3484058507
宣传刊物
3551765771
数据表
`;
};谢谢,我喜欢你的方法。不幸的是,这不适用于我提供的数据,因为数据嵌套在“.concepts”和“.concept”divs中,不总是“.taxonomy”。那么您能提供更大的数据示例吗?或者您可以尝试更改这些选择器以匹配您的数据(例如,将“.taxonomy”更改为“.concepts”),我意识到我不小心在原始xml中的注释旁边放了一个“.taxonomy”元素,这可能会让您感到困惑。我对它进行了编辑以使它更清晰。我的问题中的xml现在有几个嵌套级别,应该足够了;所有嵌套都在“.concept”和“.concept”中。我想到的一个想法是使用对象生成器在“.concepts”和“.concept”之间切换,以在每次递归时替换“.taxonomy”。我已更改子选择器以查找.concepts
”子对象,它似乎可以生成所需的结果
buildConceptTree: function(xml){
const doc = new dom().parseFromString(xml)
var tree = []
var selector = "//*[@class='taxonomies']"
var count = 0 // this should keep track of the depth of the node being used
function recurse(s, odd){
var nodes
console.log(count)
console.log(s)
var arr = []
nodes = xpath.select(s, doc)
nodes.forEach(node => {
try {
var children = node.childNodes
var keys = Object.keys(children).filter(x => {return Number(x)})
keys.forEach(key => {
var child = children[key]
console.log('child is: ')
console.log(child)
var obj = {}
var grandchildren = child.childNodes
var grandkeys = Object.keys(grandchildren).filter(x => {return Number(x)})
grandkeys.forEach(gk => {
var gc = grandchildren[gk]
try {
var nodevalue = gc['attributes'][0]['nodeValue']
switch(nodevalue){
case 'id':
obj['id'] = gc['textContent']
case 'name':
obj['name'] = gc['textContent']
case 'concepts':
count++
var rx = /taxonomy/
if(!rx.test(s)){
s = s+"/*[@class='taxonomy']"
}
else{
s = s
}
if (!odd){
s += "/*[@class='concepts']"
}
else {
s += "/*[@class='concept']"
}
odd = !odd
obj['children'] = recurse(s, odd)
}
}
catch(e){
}
})
arr.push(obj)
})
}
catch(e){
}
})
return arr
}
var tree = recurse(selector, false)
return tree
},
191
parser.js?d3c4:83 //*[@class='taxonomies']/*[@class='taxonomy']/*[@class='concepts']/*[@class='concept']/*[@class='concepts']/*[@class='concept']/*[@class='concepts']/*[@class='concept']/*[@class='concepts']/*[@class='concept']/*[@class='concepts']/*[@class='concept']/*[@class='concepts']/*[@class='concept']/*[@class='concepts']/*[@class='concept']/*[@class='concepts']/*[@class='concept']/*[@class='concepts']/*[@class='concept']/*[@class='concepts']/*[@class='concept']/*[@class='concepts']/*[@class='concept']/*[@class='concepts']/*[@class='concept']/*[@class='concepts']/*[@class='concept']/*[@class='concepts']/*[@class='concept']/*[@class='concepts']
parser.js?d3c4:92 child is: