【发布时间】:2021-07-12 00:05:39
【问题描述】:
我有一个在两个不同元素之间共享一个属性的 .xml 文件。我试图将一个元素中的属性与一个变量相乘,并将另一个元素中的属性与另一个变量相乘。
<acquirecosts>
<item>
<key>COST_SHOP_DEFAULT</key>
<quantity value="1"/>
<costtype>COST_TYPE_PRICE</costtype>
<items>
<item>
<item>CURRENCY_CASH</item>
<quantity value="6000"/>
</item>
</items>
<unlocks/>
</item>
</acquirecosts>
<sellprices>
<item>
<key>SELL_SHOP_DEFAULT</key>
<quantity value="1"/>
<costtype>COST_TYPE_PRICE</costtype>
<items>
<item>
<item>CURRENCY_CASH</item>
<quantity value="6000"/>
</item>
</items>
<unlocks/>
</item>
</sellprices>
<.> 中的“CURRENCY_CASH”数量值乘以 2,<.> 中的“CURRENCY_CASH”数量值乘以 0.5。
using System;
using System.Xml;
using System.Xml.XPath;
XmlDocument doc = new XmlDocument();
doc.Load(@"C:\Users\Darkye\Desktop\shopprices.xml");
var buyModifier = 2;
var sellModifier = 0.5;
var caItNodesBuy = caNode.XPathSelectElement("./acquirecosts").Elements();
foreach (var caItNodeBuy in caItNodesBuy)
{
var caItNodeItems = caItNodeBuy.XPathSelectElement("./items").Elements();
foreach (var item in caItNodeItems)
{
var caItNodeItemKey = item.Element("item").Value;
if (caItNodeItemKey != "CURRENCY_CASH") continue;
var caItNodeItemValue = (int)Math.Floor((double)int.Parse(item.Element("quantity").Attribute("value").Value) * buyModifier);
item.Element("quantity").SetAttributeValue("value", caItNodeItemValue);
}
caItNodeBuy.XPathSelectElement("./items").ReplaceNodes(caItNodeItems);
}
caNode.XPathSelectElement("./acquirecosts").ReplaceNodes(caItNodesBuy);
var caItNodesSell = caNode.XPathSelectElement("./sellprices").Elements();
foreach (var caItNodeSell in caItNodesSell)
{
var caItNodeItems = caItNodeSell.XPathSelectElement("./items").Elements();
foreach (var item in caItNodeItems)
{
var caItNodeItemKey = item.Element("item").Value;
if (caItNodeItemKey != "CURRENCY_CASH") continue;
var caItNodeItemValue = (int)Math.Floor((double)int.Parse(item.Element("quantity").Attribute("value").Value) * sellModifier);
item.Element("quantity").SetAttributeValue("value", caItNodeItemValue);
}
caItNodeSell.XPathSelectElement("./items").ReplaceNodes(caItNodeItems);
}
caNode.XPathSelectElement("./sellprices").ReplaceNodes(caItNodesSell);
但我正在努力弄清楚将“caNode”作为什么以及在何处引入。我假设它是一个变量,但除此之外我迷失了。将 caNode 更改为“doc”时,它只会在 XPathSelectElement 上引入错误。除非有更简单的方法在特定元素中应用这些编辑,否则我不确定还能尝试什么。
【问题讨论】:
-
您可以继续使用这种方法,但是您应该只反序列化它,并在内存中使用它(如果可能的话)
-
我更愿意坚持这一点。试图保持 xml 不变。本来我是手动过的,但是变化的值太多了,而且值的数量是上千的,所以很费时间。使用系统;只为我乘以所有值并能够按原样保存 xml,在这种情况下是最理想的
-
(1) 您的 XML 格式不正确。它缺少一个根元素。 (2) 对于此类任务,最好使用 XSLT 转换。
-
这只是 xml 文件的一部分。 xml 本身非常大。我只是想提供一个
和 的示例,以更好地解释我如何尝试自动将两个不同元素下的值相乘
标签: c# xml element bulkupdate