[英]Using XDocument and XElement how do I add a XAttribute and a value to XML in C#
[英]How does one increment/update integer value of an XML Attribute in C# (XAttribute)?
TL; DR :如果我在XElement
具有XAttribute
的NumFruits
,如何將值從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的相關問題 。 這也是,但並非專門針對增加價值。
我找到了一種方法(作為答案發布),並希望探索一種更可靠的方法。 由於我的程序多次執行此操作。
如果直接將XAttribute
為int
, XAttribute
更短:
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.