Powershell& XML:如何计算每个节点的特定元素

时间:2014-08-29 04:40:23

标签: xml powershell count game-development

这是我的PC游戏服务器的另一个 - 太空工程师。对此的回答似乎应该很简单,但它让我陷入困境,因为我无法找到正确的方式来调用这些信息。

我想要做的是获取每个节点中特定元素出现次数的计数。我有部分工作,但不完全是我想要的。

这是我到目前为止所做的:

摘录自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

1 个答案:

答案 0 :(得分:3)

在XPath的开头添加一个点(.),使其被识别为相对于当前$info

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