簡體   English   中英

如何在C#(XAttribute)中增加/更新XML屬性的整數值?

[英]How does one increment/update integer value of an XML Attribute in C# (XAttribute)?

TL; DR :如果我在XElement具有XAttributeNumFruits ,如何將值從0遞增/更新到1,2,3 ...?

問題:

當我嘗試像這樣增加XAttribute時:

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

當預期結果應為numFruits = 1時, numFruits的結果將為numFruits = 01 (因為初始值為0)。

不需要在解析結束時添加全局變量,因為可能會有很多籃子。

說明:

在C#Linq to XML中,可以像這樣將XAttributes添加到XElement

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

在示例中,我們使用NumFruits XAttribute作為計數器來跟蹤XDocument的水果數量。

當我遍歷(例如)每個還具有basket_owner屬性的Fruit對象的列表時,我會通過創建或添加到XElements (在本示例中為所有者)來將所有這些對象手動序列化為XML。

由於水果列表不固定,因此我必須將Fruit元素添加到XElement並通過首先檢查owner元素是否存在來更新XAttribute (我已經使用LINQ查詢並檢查它們是否為null),然后添加了小時候的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的相關問題 這也是,但並非專門針對增加價值。

我找到了一種方法(作為答案發布),並希望探索一種更可靠的方法。 由於我的程序多次執行此操作。

如果直接將XAttributeintXAttribute更短:

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已經了解其余信息

到目前為止,我發現最簡單的方法是:

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

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

這樣做是搶占我們想要的屬性,並通過首先將現有值解析為Integer ,然后將該值增加1來設置值。這是因為設置為XAttributes的值被保存/檢索為字符串。

嘗試遞增時,執行basket.Attribute("numFruits") += 1產生01而不是1或11而不是2的原因是,屬性值存儲為字符串,並且執行+ =操作成為字符串連接對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM