【问题标题】:How does one increment/update integer value of an XML Attribute in C# (XAttribute)?如何在 C# (XAttribute) 中增加/更新 XML 属性的整数值?
【发布时间】:2015-05-04 21:44:46
【问题描述】:

TL;DR:如果我在 XElement 中有一个 XAttributeNumFruits,我如何将值从 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 属性,我通过创建或添加到 XElements 手动将所有这些对象序列化为 XML,在此示例中将是所有者.

由于水果列表不固定,我必须将 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>

这里有一个related question,关于如何增加 XML 元素(在本例中为 XElement),而不是 XAttribute。还有this as well,但不是专门用来增加价值的。

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

【问题讨论】:

    标签: c# xml linq xelement xattribute


    【解决方案1】:

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

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

    就像XElementXAttribute也有一些explicit conversion operators预定义。


    Working example*:

    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已经知道其余的了

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

      • 既然您知道属性值是字符串,您可能需要重新考虑就地修改 XDocument 的概念。
      猜你喜欢
      • 1970-01-01
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      • 1970-01-01
      相关资源
      最近更新 更多