С MSDN : "Объект XPathNavigator создается из класса, реализующего интерфейс IXPathNavigable, например классы XPathDocument и XmlDocument. Объекты XPathNavigator, созданные объектами XPathDocument, доступны только для чтения в то время как объекты XPathNavigator, созданные объектами XmlDocument, можно редактировать. Состояние объекта XPathNavigator, доступное только для чтения или редактируемое, определяется с помощью свойства CanEdit класса XPathNavigator. "
Итак, прежде всего вы должны использовать XmlDocument, а не XPathDocument, если вы хотите установить атрибут.
Пример того, как изменить данные XML с помощью XPathNavigator с помощью метода CreateNavigator объекта XmlDocument, показан здесь .
Как вы увидите из примера, в вашем объекте it.Current есть метод SetValue .
Вот как бы вы сделали это для своего кода, с небольшими изменениями:
int vid = 2;
var doc = new XmlDocument();
doc.LoadXml("<Equipment><Items><SubItems vid=\"1\" name=\"Foo\"/><SubItems vid=\"2\" name=\"Bar\"/></Items></Equipment>");
var nav = doc.CreateNavigator();
foreach (XPathNavigator it in nav.Select("/Equipment/Items/SubItems"))
{
if(it.MoveToAttribute("vid", it.NamespaceURI)) {
int vidFromXML = int.Parse(it.Value);
if (vidFromXML == vid)
{
// if(it.MoveToNextAttribute() ... or be more explicit like the following:
if (it.MoveToParent() && it.MoveToAttribute("name", it.NamespaceURI))
{
it.SetValue("Two");
} else {
throw new XmlException("The name attribute was not found.");
}
}
} else {
throw new XmlException("The vid attribute was not found.");
}
}