2014-08-29 55 views
3

這是另一個用於我的PC遊戲 - 太空工程師服務器。答案似乎應該是簡單的,但它讓我陷入了困境,因爲我找不到調用這些信息的正確方法。Powershell和XML:如何統計每個節點的特定元素

我想要做的是獲得特定元素出現在每個節點中的次數。我有這個部分工作,但不完全是我想要的。

這是我到目前爲止有:

從XML的摘錄(摺疊除了目標節點的節點)

<MyObjectBuilder_Sector xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Position> 
    <SectorEvents> 
    <AppVersion> 
    <SectorObjects> 
    <MyObjectBuilder_EntityBase xsi:type="MyObjectBuilder_CubeGrid"> 
     <CubeBlocks> 
      <MyObjectBuilder_CubeBlock xsi:type="MyObjectBuilder_Reactor"> 
      <MyObjectBuilder_CubeBlock xsi:type="MyObjectBuilder_Thrust"> 
      <MyObjectBuilder_CubeBlock xsi:type="MyObjectBuilder_Drill"> 
      <MyObjectBuilder_CubeBlock xsi:type="MyObjectBuilder_Drill"> 
       <SubtypeName>SmallBlockDrill</SubtypeName> 
       <EntityId>72280681079646079</EntityId> 
       <Min x="1" y="1" z="-7" /> 
       <BlockOrientation Forward="Forward" Up="Left" /> 
       <ColorMaskHSV x="0" y="-1" z="0" /> 
       <Owner>144256542526969420</Owner> 
       <ShareMode>None</ShareMode> 
       <ShowOnHUD>false</ShowOnHUD> 
       <Enabled>false</Enabled> 
       <Inventory> 
       <Items /> 
       <nextItemId>0</nextItemId> 
       </Inventory> 
      </MyObjectBuilder_CubeBlock> 

和我的PowerShell代碼,讓我回每個立方體塊數

<MyObjectBuilder_EntityBase xsi:type="MyObjectBuilder_CubeGrid"> 

立方體網格。

$filePath = 'F:\DedicatedServer\DataDir\SE Survival 2\Saves\VPS RC 1\SANDBOX_0_0_0_.sbs' 
[xml]$myXML = Get-Content $filePath 
$ns = New-Object System.Xml.XmlNamespaceManager($myXML.NameTable) 
$ns.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance") 

$infos = $myXML.SelectNodes("//SectorObjects/MyObjectBuilder_EntityBase[(@xsi:type='MyObjectBuilder_CubeGrid')]" ,$ns) 

foreach ($info in $infos){ 

     $info.CubeBlocks.MyObjectBuilder_CubeBlock.count 
} 

所以我試圖得到這個反饋每個立方體網格小鑽的數量。在這裏看到的XML

<MyObjectBuilder_CubeBlock xsi:type="MyObjectBuilder_Drill"> 
     <SubtypeName>SmallBlockDrill</SubtypeName> 

我覺得這是接近解決,但其恢復爲每立方網同樣的號碼,這樣可以不正確。

$info = $info.SelectNodes("//CubeBlocks/MyObjectBuilder_CubeBlock[(@xsi:type='MyObjectBuilder_Drill')]/SubtypeName['SmallBlockDrill']" ,$ns).InnerText 
$info.count 

下面的結果。我相信這是世界範圍內大型和小型演習的總數,只是爲每個發現的網格重複。感覺接近,但我打賭子類型值選擇不工作,因爲我想要它。

490 
490 
490 
490 
490 
490 
490 
490 

回答

3

在你的XPath,使它確認有關的開始點(.)添加到當前$info

foreach ($info in $infos){ 
    $info.SelectNodes("./CubeBlocks/MyObjectBuilder_CubeBlock[(@xsi:type='MyObjectBuilder_Drill')]/SubtypeName['SmallBlockDrill']" ,$ns).count 
} 
+0

有時候你只需要另一雙眼睛!解決了。 – Tostito80 2014-08-29 05:56:13

相關問題