Javascript 使用XPath获取XML元素的层次结构

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.//*

我试图在application/xml response.data文档中获取给定元素的层次结构的有序列表,我使用Javascript中的DOM解析器对其进行解析。因此表达式应该为每个没有子级的标记返回列表['grandparent','Parent','Target']。因此,我将得到一个列表列表,其中内部列表的最后一个元素将是图形深度值中最深的。 感谢@Jack Fleeting,我知道我可以使用下面的xpath表达式获得目标: xpath='//*[local name=A][not.//*[local name=A]]/*[local name=A-title]'但我不知道如何调整它以进入层次结构列表

<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); 
}