2014-01-10 25 views
0

我的XML看起來是這樣的:XDOC更新與沒有相同元素的name屬性

<?xml version="1.0" encoding="utf-8"?> 
    <Properties> 
    <Ranges> 
    <GridRange> 
    <ColumnID>991</ColumnID> 
    <LowerBound>30</LowerBound> 
    <UpperBound>59</UpperBound> 
    </GridRange> 
    <GridRange> 
    <ColumnID>991</ColumnID> 
    <LowerBound>60</LowerBound> 
    <UpperBound /> 
    </GridRange> 
    </Ranges> 
</Properties> 

我想內1000我的代碼只更新先更新元素的值(當它是991)到1000而不是第二個。

XElement columnID = xProperty.Root.Elements("Ranges").Elements("GridRange").Elements("ColumnID").FirstOrDefault(); 
if (null != columnID && Convert.ToInt64(columnID.Value) == 991) 
    columnID.Value = "1000"; 

但我希望ColumnID元素值都是1000.我如何實現這一點。

+0

是的,你有調用'.FirstOrDefault()'...你是否嘗試刪除它並更新結果中的所有元素? –

回答

2

嘗試下面的代碼通過所有GridRange元素迭代和評估ColumnID元素的值。

Int64 columnID = Int64.MinValue; 
foreach (var xElem in xProperty.Descendants("GridRange")) 
{ 
    columnID = Int64.MinValue; 
    var elem = xElem.Element("ColumnID"); 
    if (elem == null || !Int64.TryParse(elem.Value, out columnID) || columnID != 991) 
     continue; 
    elem.Value = "1000"; 
} 

現在你肯定需要一個Int64,而不是一個Int32ColumnID的值是否可能超過2,147,483,647

編輯 - 如果沒有轉換

如果沒有需要轉換的代碼變得非常容易和短路。

foreach (var xElem in xProperty.Descendants("GridRange").Elements("ColumnID").Where(x => x.Value.Equals("991"))) 
      xElem.Value = "1000"; 
+0

該值只是一個字符串;無需轉換爲int(32/64)。只需檢查元素==「991」的值。 –

+0

@MetroSmurf只是遵循OP的原始問題。不知道他們爲什麼要轉換。 – Nico

+0

謝謝Nico,第二個解決方案非常簡單。豎起大拇指.. – Vinnie

0

這是因爲您正在使用FirstOrDefault。爲了實現你想要的東西,具體操作如下:

xDoc.Root.Elements("Ranges") 
     .Elements("GridRange") 
     .Elements("ColumnID") 
     .Where(xe => xe.Value == "991") 
     .ToList() 
     .ForEach(el => el.Value = "1000");