簡體   English   中英

使用 XPath 獲取 XML 元素的層次結構

[英]Get the hierarchy of a XML element with XPath

我試圖在“application/xml”response.data 文檔中獲取給定元素層次結構的有序列表,我使用 Javascript 中的 DOM 解析器解析該文檔。 因此,表達式應該為每個沒有 A 子級的 A 標記返回列表 ['Grand Parent','Parent','Target']。 所以我將得到一個列表列表,其中內部列表的最后一個元素將是 <A-title> 的最深(就圖形深度而言)值。 感謝@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>

編輯:

axios.get('WMS_URL').then((r) => {
      const parser = new DOMParser()
      const dom = parser.parseFromString(r.data, 'application/xml')
       let xpath = '//*[local-name()="A"][not(.//*[local-name()="A"])]/*[local-name()="A-title"]'
       let xpath2 = 'ancestor-or-self::A/A-title'
       var targets = dom.evaluate(xpath, dom, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
       var targets2 = dom.evaluate(xpath2, targets, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
       Array.from({ length: targets2.snapshotLength }, (_, index) => layerNames.push(targets2.snapshotItem(index).innerHTML))

如果您使用 XPath //A[not(A)]/ancestor-or-self::A/A-title你會得到//A[not(A)] all A元素沒有A孩子和下一步導航到所有祖先或自身A元素並持續到所有A-title子元素。 當然,在 XPath 1 中,您無法使用單個表達式構建字符串(或元素?)列表的列表,因此您首先需要 sel3ect //A[not(A)]然后從那里 select ancestor-or-self::A/A-title元素。

Using XPath 3.1, for instance with Saxon JS 2 ( https://www.saxonica.com/saxon-js/index.xmlm , https://www.saxonica.com/saxon-js/documentation/index.html ),您可以直接構造一個字符串序列 arrays 例如

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM