Javascript 使用XPath获取XML元素的层次结构
我试图在application/xml response.data文档中获取给定元素的层次结构的有序列表,我使用Javascript中的DOM解析器对其进行解析。因此表达式应该为每个没有子级的标记返回列表['grandparent','Parent','Target']。因此,我将得到一个列表列表,其中内部列表的最后一个元素将是图形深度值中最深的。 感谢@Jack Fleeting,我知道我可以使用下面的xpath表达式获得目标: xpath='//*[local name=A][not.//*[local name=A]]/*[local name=A-title]'但我不知道如何调整它以进入层次结构列表Javascript 使用XPath获取XML元素的层次结构,javascript,xml,dom,xpath,dom-traversal,Javascript,Xml,Dom,Xpath,Dom Traversal,我试图在application/xml response.data文档中获取给定元素的层次结构的有序列表,我使用Javascript中的DOM解析器对其进行解析。因此表达式应该为每个没有子级的标记返回列表['grandparent','Parent','Target']。因此,我将得到一个列表列表,其中内部列表的最后一个元素将是图形深度值中最深的。 感谢@Jack Fleeting,我知道我可以使用下面的xpath表达式获得目标: xpath='//*[local name=A][not.//*
<A>
<A-title>Grand Parent</A-title>
<A>
<A-title>Parent</A-title>
<A>
<A-title>Target</A-title>
</A>
</A>
</A>
如果使用XPath//A[notA]/祖先或self::A/A-title,则所有A元素都没有子元素,下一步导航到所有祖先或self A元素,最后导航到所有A-title子元素。当然,在使用单个表达式的XPath 1中,不能构造字符串或元素列表?因此,首先需要选择3ect//A[notA],然后从中选择祖先或self::A/A-title元素
使用XPath3.1,例如Saxon JS 2,可以直接构造字符串数组序列,例如
//A[not(A)] ! array { ancestor-or-self::A/A-title/data() }
用于计算XPath的JavaScript代码如下:
let result = SaxonJS.XPath.evaluate('parse-xml($xml)//A[not(A)] ! array { ancestor-or-self::A/A-title/data() }', [], { params : { 'xml' : r.data }})
对于DOM Level 3 XPath 1.0,我认为您需要更多的代码行:
let xmlDoc = new DOMParser().parseFromString(r.data, 'application/xml');
let leafAElements = xmlDoc.evaluate('//A[not(A)]', xmlDoc, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
let result = [];
for (let i = 0; i < leafAElements.snapshotLength; i++) {
let titleEls = xmlDoc.evaluate('ancestor-or-self::A/A-title', leafAElements.snapshotItem(i), null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
let titles = [];
for (let j = 0; j < titleEls.snapshotLength; j++) {
titles.push(titleEls.snapshotItem(j).textContent);
}
result.push(titles);
}
如果您使用Saxon JS 2而不是使用DOMParser和XPath 1 evaluate,我将使用例如axios.get'WMS_URL'。thenr=>{let result=SaxonJS.XPath.evaluate'parse-xml$xml//A[notA]!数组{祖先或self::A/A-title/data}',[],{params:{xml:{r.data};}。然后,then处理程序中的结果变量是一个JavaScript数组,其中包含具有a-title值的字符串数组。
let xmlDoc = new DOMParser().parseFromString(r.data, 'application/xml');
let leafAElements = xmlDoc.evaluate('//A[not(A)]', xmlDoc, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
let result = [];
for (let i = 0; i < leafAElements.snapshotLength; i++) {
let titleEls = xmlDoc.evaluate('ancestor-or-self::A/A-title', leafAElements.snapshotItem(i), null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
let titles = [];
for (let j = 0; j < titleEls.snapshotLength; j++) {
titles.push(titleEls.snapshotItem(j).textContent);
}
result.push(titles);
}