2017-05-23 35 views
1

想我需要從以下XML提取數據:提取一部分以顯示提取的值的父 - 子關係

<Parents> 
    <Parent id="1" parentname="Bob"> 
    <Children> 
     <Child id="1" name="kid1" /> 
     <Child id="2" name="kid2" /> 
     <Child id="3" name="kid3" /> 
    </Children> 
    </Parent> 
    <Parent id="2" parentname="Karen"> 
    <Children> 
     <Child id="4" name="kid4" /> 
     <Child id="5" name="kid5" /> 
     <Child id="6" name="kid6" /> 
    </Children> 
    </Parent> 
</Parents> 

,我期待提取不但所有孩子的名字,而且該特定孩子屬於哪個父母。

所以我希望能夠提取的東西,讓我知道了,例如:

  • kid1屬於Bob
  • kid6屬於Karen

或者,在表格格式:

Parent: Child: 
Bob  kid1 
Bob  kid2 
Bob  kid3 
Karen kid4 
Karen kid5 
Karen kid6 

我知道我可以提取每一個相當簡單使用的XPath沿線的這些單獨的數據元素:

Parents = "/Parents/Parent/@parentname" 
Children = "/Parents/Parent/Children/Child/@name" 

但有什麼辦法,同時提取他們兩個,所以我可以知道父/子關係而無需爲每個父項可能性創建多個XPath?

謝謝!

回答

1

使用for遍歷所有Child節點迭代保持參照當前Parent節點:

for $p in Parents/Parent 
return $p/Children/Child/concat("parent: ", $p/@parentname, "; child: ", @name) 

輸出:

parent: Bob; child: kid1 
parent: Bob; child: kid2 
parent: Bob; child: kid3 
parent: Karen; child: kid4 
parent: Karen; child: kid5 
parent: Karen; child: kid6 

您可以按調整concat()函數參數的需要。
你可以在這裏查看這個方法https://www.freeformatter.com/xpath-tester.html#ad-output

+0

我沒有線索,你可以在XPath中做這樣的變量命名/循環操作! - 真棒新知識! - 謝謝!!! –

+1

@JohnBus​​tos,不客氣。我應該提到for for循環是XPath 2.0特性 – RomanPerekhrest

+0

謝謝,我確實注意到...似乎很少有XPath工具允許使用它,但我仍然需要它用於我的.Net代碼。看看它是如何工作的。再次感謝,因爲它正是我想要的! –