【问题标题】:Trying to set multiple property values in xml using xpath尝试使用 xpath 在 xml 中设置多个属性值
【发布时间】:2023-01-13 08:15:02
【问题描述】:

开始, 我正在尝试调整我为游戏创建的模组(7 Days To Die) 我真的没有很多 XML 修改经验。但我让它做我想做的事。

但是,我不想遍历列表中的每个项目而必须调整项目的值。

XML 文件示例:

<?xml version="1.0" encoding="UTF-8"?>
<items>
<item name="ammo9mmBulletBall">
    <property name="Tags" value="ammo"/>
    <property name="DisplayType" value="ammoBullet"/>
    <property name="HoldType" value="45"/>
    <property name="Meshfile" value="#Other/Items?Misc/sackPrefab.prefab"/>
    <property name="DropMeshfile" value="#Other/Items?Misc/sack_droppedPrefab.prefab"/>
    <property name="Material" value="Mbrass"/>
    <property name="MeltTimePerUnit" value=".4"/>
    <property name="Stacknumber" value="300"/> <!-- STK ammo high -->
    <property name="EconomicValue" value="9"/>
    <property name="Group" value="Ammo/Weapons,Ammo,Ranged Weapons"/>
    <effect_group name="ammo9mmBulletBall" tiered="false">
        <passive_effect name="EntityDamage" operation="base_set" value="32" tags="perkGunslinger,9mmGun"/>
        <passive_effect name="BlockDamage" operation="base_set" value="6" tags="perkGunslinger"/>
        <passive_effect name="DamageModifier" operation="perc_add" value="-.8" tags="earth"/>
        <passive_effect name="DamageModifier" operation="perc_add" value="2" tags="wood"/>
    </effect_group>
</item>
</items>

mod 文件的示例:

<?xml version="1.0" encoding="utf-8"?>
<configs>
<!-- * * * * * * * * * * ammunition / arrows / bolts / fuel * * * * * * * * * * -->
<set xpath="/items/item[starts-with(@name, 'ammo')]/property[@name='Stacknumber']/@value">500</set>

我的问题是,XML 文档中还有其他一些我不想更改的以“ammo”开头的项目。

我试图找到有关在 xpath 中出现异常的信息,例如:

<set xpath="/items/item[starts-with(@name, 'ammo'[not(@name, 'ammoBundle')])]/property[@name='Stacknumber']/@value">500</set>

然而这显然不起作用。 有没有办法做到这一点?还是我必须坚持手动编辑每个值?

我调查的另一种选择是,它是否属于“弹药/武器、弹药、远程武器”组 但我也找不到相关信息。

如果有人可以帮助我,那就太好了。

编辑: 我能够实现我所追求的一部分:

<set xpath="/items/item[starts-with(@name, 'ammo') and not(contains(@name, 'Bundle'))]/property[@name='Stacknumber']/@value">500</set>

但是,我仍在尝试根据已设置的属性值,根据使用上述方法找到的项目更改属性值:&lt;property name="Group" value="Ammo/Weapons,Ammo,Ranged Weapons" 因此,如果项目具有上面列出的属性值,它们将调整其“Stacknumber”属性值。 不确定这是否可能。

编辑:进一步的例子 所以这只是项目本身,每行没有属性。

Example of what I want to include
<item name="ammo9mmBulletBall">
<item name="ammo9mmBulletHP">
<item name="ammo9mmBulletAP">
<item name="ammo44MagnumBulletBall">
<item name="ammo44MagnumBulletHP">
<item name="ammo44MagnumBulletAP">
<item name="ammoDartIron">
<item name="ammoShotgunBreachingSlug">


Example of what I want to exclude
<item name="ammoJunkTurretRegular">
<item name="ammoJunkTurretShell">
<item name="ammoJunkTurretAP">
<item name="ammoBundleMaster">
<item name="ammoBundleJunkTurretRegular">
<item name="ammoBundleJunkTurretShell">
<item name="ammoGasCanBundle">
<item name="ammoArrowFlamingSchematic">
<item name="ammoCrossbowBoltExplodingSchematic">
<item name="ammoGasCanSchematic">
<item name="ammoProjectileZombieVomit">

【问题讨论】:

    标签: xml xpath


    【解决方案1】:

    如果你只想修改 item@name 是 "ammo9mmBulletBall" 然后使用 item[@name='ammo9mmBulletBall'] 而不是 item[starts-with(@name, 'ammo')]

    【讨论】:

    • 不,我想调整 xml 文档中以“弹药”开头的多个项目,但是还有其他一些我不想更改的以弹药开头的项目,正如我所说,能够使用“而不是(@name) ,但是我只能做一次,我不能指定多个条件。
    • 您需要提供要包括的案例和要排除的案例的示例。你可以组合多个条件,但是你没有说清楚条件是什么。至少,我不明白你的具体要求是什么。您能否包含整个文件,并添加 cmets 以显示您要包含和排除哪些元素?
    • 在 XPath 中,您的布尔条件通过将它们括在方括号中而被视为“谓词”,并且您可以通过在 XPath 中一个接一个地放置一个方括号谓词来组合谓词。例如foo[@type='bar'][not(baz='quux')],或者您可以在单个谓词中使用布尔值 and 运算符,例如foo[@type='bar' and not(baz='quux')]
    • 我将更新问题,但我不会添加整个文件,因为它是一个长文件并且并非所有文件都是相关的。
    • 正如我在之前的评论中提到的,如果我添加了第二个“和”谓词,它就会出错,我会得到确切的错误并很快将其粘贴到这里。我没有尝试使用单独的方括号谓词,我会尝试的。
    【解决方案2】:

    我已经为 7D2D 制作了一些 XML mod,尽管您可以链接“and”语句,但我建议避免使用它,因为它会迅速增长并变得不可读。

    相反,找到最常见的起始短语,不包括你不想要的短语,并使用它们:

    <set xpath="//item[starts-with(@name, 'ammo9mm')]/property[@name='Stacknumber']/@value">500</set>
    <set xpath="//item[starts-with(@name, 'ammo44Mag')]/property[@name='Stacknumber']/@value">500</set>
    <set xpath="//item[starts-with(@name, 'ammo762mm')]/property[@name='Stacknumber']/@value">500</set>
    ...
    

    (注意开头的双斜杠 // 表示匹配以下项目出现的任何地方,您可以删除初始的 /items/ 作为结果。)

    相信我,我是一名软件开发人员,我理解想要获得一个漂亮的 xpath 来捕获所有这些的愿望,但是你花在寻找它上的时间将使踢出 8 或 9 个单独的实际时间相形见绌xpaths 将做同样的工作。有了这些配置,很少需要十几个才能达到结果。

    但是,如果您致力于链接“和”语句,那么我认为您遇到的问题可能与拼写错误有关。我刚刚试过这个并且它没有问题:

    <set xpath="/items/item[starts-with(@name, 'ammo') and not(contains(@name, 'Bundle')) and not(contains(@name, 'Junk'))]/property[@name='Stacknumber']/@value">500</set>
    

    你可以在this xpath tester上测试,你甚至可以上传项目.xml文件以获得游戏中所有内容的精确匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多