Хорошо, нашел решение.Я начал задаваться вопросом, почему @Kim хотел фрагмент из моего XML.Таким образом, это заставило меня думать, что Data.Root.Element()
, возможно, не был правильным путем.Поэтому я попробовал вместо Descendants()
, и это действительно работает.Зачем?Я понятия не имею.Вот почему:
В другом репо у меня есть XDocument.load()
в конструкторе репо.Я подумал, что это будет хорошо, потому что тогда мне не придется повторять один и тот же код во всех методах CRUD.Но так как я хотел xml-динамику, а конструктор не принимает параметры, я подумал, что этот путь (оригинальный вопрос) будет в порядке.Вот код из «статического» репо:
//Constructor
public CubeRepository()
{
allCubes = new List<Cube>();
CubeData = XDocument.Load(HttpContext.Current.Server.MapPath("~/App_Data/Cubes/Cubep10p11.xml"));
var cubes = from cube in CubeData.Descendants("item")
select new Cube(cube.Element("ID").Value,
cube.Element("Name").Value,
cube.Element("Type").Value,
(int)cube.Element("Kr"),
(int)cube.Element("Euro"));
allCubes.AddRange(cubes.ToList<Cube>());
}
И в моем методе редактирования этого репо:
public void EditCube(Cube cube)
{
XElement node = CubeData.Root.Elements("item").Where(i => (string)i.Element("ID") == cube.ID).FirstOrDefault();
node.SetElementValue("ID", cube.ID);
node.SetElementValue("Name", cube.Name);
node.SetElementValue("Type", cube.Name);
node.SetElementValue("Kr", cube.Kr);
node.SetElementValue("Euro", cube.Euro);
CubeData.Save(HttpContext.Current.Server.MapPath("~/App_Data/Cubes/Cubep10p11.xml"));
}
И это работает, как я очаровываю, хотя я использую CubeData.Root.Elements("item")
.Примечание: Elements
от Descendants
.Структура XML-файлов идентична.