这是我的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
答案 0 :(得分:3)
在XPath的开头添加一个点(.
),使其被识别为相对于当前$info
:
foreach ($info in $infos ){
$info.SelectNodes("./CubeBlocks/MyObjectBuilder_CubeBlock[(@xsi:type='MyObjectBuilder_Drill')]/SubtypeName['SmallBlockDrill']" ,$ns).count
}