使用No属性更新具有相同元素名称的xDoc

时间:2014-01-10 02:26:39

标签: c# .net xml

我的XML看起来像这样:

<?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>

我想将元素的值(当它是991时)更新到1000.我的代码只更新第一个到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.我如何实现这一点。

2 个答案:

答案 0 :(得分: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而不是Int32吗? ColumnID值是否可能超过2,147,483,647

编辑 - 没有转化

如果不需要转换,则此代码变得非常简单和短暂。

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

答案 1 :(得分:0)

那是因为你正在使用FirstOrDefault。要实现您的目标,请执行以下操作:

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