0

TL;DR:如果我有一个XAttributeof NumFruitsin an XElement,我如何将值从 0 递增/更新到 1,2,3...?

问题:

当我尝试像这样增加 XAttribute 时:

basket.Attribute("numFruits").Value += 1 

结果numFruits将是numFruits = 01(因为 0 是初始值),而预期的结果应该是numFruits = 1

不希望在解析结束时添加全局变量,因为可能有很多篮子。

解释:

在 C# Linq to XML 中,可以添加XAttributes类似的XElement内容。

XElement basket = new XElement("Marys_Basket", new XAttribute("NumFruits", 0);

在示例中,我们NumFruits XAttribute用作计数器来跟踪XDocument.

当我通过一个(例如)Fruit 对象列表进行交互时,每个都具有一个属性,我通过创建或添加在此示例中将是所有者basket_owner的对象来手动将所有这些对象序列化为 XML 。XElements

由于水果列表不固定,我必须将 Fruit 元素添加到 XElement 并XAttribute通过首先检查所有者元素是否存在来更新(我已经使用 LINQ 查询并检查它们是否为空),然后添加 Fruit XElement 作为一个孩子,产生类似这样的东西:

<Root>
  <Marys_basket numFruits=2>
     <Fruit name="Mango"/>
     <Fruit name="Papaya"/>
  </Marys_basket>
  <Jons_basket numFruits=0 />
  <Bobs_basket numFruits=1> 
     <Fruit name="Apple"/>
  </Bobs_basket>
</Root>

这是关于如何增加 XML 元素(在本例中为 XElement)而不是 XAttribute的相关问题。也是如此,但不是专门为了增加价值。

我找到了一种方法(作为答案发布)并且想探索一种更强大的方法来做到这一点。因为我的程序多次这样做。

4

2 回答 2

2

如果您直接将其XAttribute转换为会更短int

basket.FirstAttribute.SetValue((int)basket.FirstAttribute + 1);

就像XElement,XAttribute也有一些预定义的显式转换运算符


工作示例*:

using System;
using System.Xml.Linq;
using System.Xml;

public class Program
{
    public static void Main()
    {
        var xml = @"<Root>
  <Marys_basket numFruits=""2"">
     <Fruit name=""Mango""/>
     <Fruit name=""Papaya""/>
  </Marys_basket>
  <Jons_basket numFruits=""0"" />
  <Bobs_basket numFruits=""1""> 
     <Fruit name=""Apple""/>
  </Bobs_basket>
</Root>";
        var doc = XDocument.Parse(xml);
        XElement basket = doc.Root.Element("Marys_basket");
        basket.FirstAttribute.SetValue((int)basket.FirstAttribute + 1);
        Console.WriteLine(doc.ToString());
    }
}

*:主要针对未来的访客,因为我相信 OP 已经知道其余的

于 2015-05-04T23:24:45.010 回答
0

到目前为止我发现的最短的方法:

basket.FirstAttribute.SetValue( Int32.Parse( basket.FirstAttribute.Value ) + 1);

注意basket.Attribute("numFruits")也可以使用。

这样做是通过首先将现有值解析为 anInteger然后将值增加 1 来获取我们想要的属性并设置值。这是因为设置为 XAttributes 的值被保存/检索为字符串。

basket.Attribute("numFruits") += 1尝试递增时会产生 01 而不是 1 或 11 而不是 2的原因是 Attribute 值存储为字符串,并且执行 += 操作成为字符串连接对象。

于 2015-05-04T21:44:46.993 回答