这是我服务器上的另一个 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/