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



这是我的服务器为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:DedicatedServerDataDirSE Survival 2SavesVPS RC 1SANDBOX_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

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

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

相关内容

  • 没有找到相关文章

最新更新