xml - Powershell 和 XML : How to count specific elements for each node

标签 xml powershell count game-development

这是我服务器上的另一个 PC 游戏 - Space Engineers。这个问题的答案看起来应该很简单,但它让我陷入困境,因为我找不到调用此信息的正确方法。

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

这是我目前所拥有的:

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 代码,它返回每个立方体 block 的数量

<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

最佳答案

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

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

关于xml - Powershell 和 XML : How to count specific elements for each node,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25561808/

相关文章:

mysql - SQL计数/查询帮助

javascript - WSO2 ESB 中如何选择类中介器或脚本中介器?

powershell - 在PowerShell中使用Monad?

Powershell 工作流动态事件编译器错误 '.' 预期使用 $Date 变量

.net - 如何在 PowerShell 中创建 `PSObject`

python - 在Python中对计数列表进行排序

python - 是否可以在 PYTHON 的一个命令中对多个字符串使用 .count?

java - Maven pom.xml 问题(缺少项目构建错误 "version")

xml - 您如何全局设置 Jackson 以忽略 Spring 中的未知属性?

c# - SQL Server Express 的连接字符串