Вам необходимо абстрагироваться (создать классы) вашего xml, это поможет вам CRUD и найти его.
Пример: (с использованием этих расширений: http://searisen.com/xmllib/extensions.wiki)
public class Device
{
const bool ELEMENT = false;
const bool ATTRIBUTE = true;
XElement self;
public Device(XElement self) { this.self = self; }
public string CustomName
{
get { return self.Get("customname", string.Empty); }
set { self.Set("customname", value, ELEMENT); }
}
public string Name { get { return self.Get("name", string.Empty); } }
public string Ip { get { return self.Get("ip", "0.0.0.0"); } }
public int Port { get { return self.Get("port", 0); } }
public Source[] Sources
{
get { return _Sources ?? (_Sources = self.GetEnumerable("sources/source", xsource => new Source(xsource)).ToArray()); }
}
Source[] _Sources;
public class Source
{
XElement self;
public Source(XElement self) { this.self = self; }
public string Code { get { return self.Get("code", string.Empty); } }
public string Name { get { return self.Get("name", string.Empty); } }
public bool Hidden { get { return self.Get("hidden", false); } }
}
}
Anпример его использования:
XElement xdevices = XElement.Load(file.FullName);
Device[] devices = xdevices.GetEnumerable("device", xdevice => new Device(xdevice)).ToArray();
var myDevice = devices
.Where(d => d.Name == App.CurrentDeviceName
&& d.Ip == App.CurrentIp);
foreach (Device device in myDevice)
{
string name = device.Name;
foreach (Device.Source source in device.Sources)
{
string sourceName = source.Name;
}
device.CustomName = "new name";
}
xdevices.Save(file.FullName);
Это изменение в мышлении, поэтому вместо того, чтобы беспокоиться о том, как ссылаться на значение, вы создаете класс для чтения / записи в xml, и вместо этого вы простополучить / передать данные в класс, который затем читает / записывает xml.
Редактировать: ---- Добавить в класс XElementConversions ----
Вбыть совместимым с файлом, и для правильной работы я сделал подробные версии. Вы можете изменить их, чтобы сделать другие типы, такие как bool, DateTime и т. д.
public static int GetInt(this XElement source, string name, int defaultValue)
{
source = NameCheck(source, name, out name);
return GetInt(source, source.GetDefaultNamespace() + name, defaultValue);
}
public static int GetInt(this XElement source, XName name, int defaultValue)
{
int result;
if (Int32.TryParse(GetString(source, name, null), out result))
return result;
return defaultValue;
}