c# linq to xml 更新特定值的所有后代

c# linq to xml update all descendants of specific value

我正在创建配置文件编辑器,目前正在实施更新现有数据的功能。我希望能够更新文件中具有特定属性的所有属性,例如更新用户名。

我的 XML 文件以下列方式表示用户:

<user user="user1" ... />
<user user="user2" ... />

我现在的尝试是这样的:

 xdoc.Descendants().Where(a => a.Attribute("user").Value == UserEditInput).FirstOrDefault().SetAttributeValue("user", NewUser);

其中 UserEditInput 是当前用户名的名称,NewUser 是新的替换值。

这会引发 NullReferenceException。上面显示的表单中有许多 "user" 个 XAttributes,其值等于 UserEditInput 的值。这让我相信我没有以正确的方式引用所需的数据,没有正确修改属性,或两者兼而有之。

提前感谢您的帮助。

目前您正在尝试获取文档中 每个 元素的 user 属性的值 - 例如,包括根元素。

这里有两个选项,我可能会同时使用:

  • 指定您只需要 user 个元素,使用 xdoc.Descendants("user")
  • 使用 XAttributestring 的转换而不是 Value 属性;这样,如果没有这样的属性,演员表也会 return null

此外,如果您没有找到匹配的元素,那么您使用的是 FirstOrDefault,因此您将获得一个空值 - 但您仍然会尝试设置该属性值。不要那样做。

因此,将它们放在一起 - 并通过使用带有谓词的 FirstOrDefault 的重载来走捷径:

var element = xdoc.Descendants("user")
                  .FirstOrDefault(a => (string) a.Attribute("user") == UserEditInput);

if (element != null)
{
    element.SetAttributeValue("user", NewUser);
}