I have a method that is suppose to edit a xml file:
public void EditItem(Item item, string xml)
{
Data = XDocument.Load(HttpContext.Current.Server.MapPath("~/App_Data/Items/" + xml + ".xml"));
XElement node = Data.Root.Elements("item").Where(i => (string)i.Element("ID") == item.ID).FirstOrDefault();
node.SetElementValue("ID", item.ID);
node.SetElementValue("Name", item.Name);
node.SetElementValue("Type", item.Type);
node.SetElementValue("Kr", item.Kr);
node.SetElementValue("Euro", item.Euro);
Data.Save(HttpContext.Current.Server.MapPath("~/App_Data/Tables/" + xml + ".xml"));
}
I get this validation error thru a try/catch in my controller: “Object reference not set to an instance of an object.” Through some debugging, I found that “node” is null, even though “Data” contains all the right data from the xml, and the model.ID is correct.
the wierd thing is, that I have it working in another repo where the xml isnt dynamic, and the XDocument obj is loaded in the constructor.
Any ideas what causes it? Or maybe some ideas on a workaround.
Update. Xml snippet:
<?xml version="1.0" encoding="utf-8"?>
<catagory id="0">
<module>
<item>
<ID>101</ID>
<Name>ClassicoTable(35x100x100)</Name>
<Type>Model</Type>
<Kr>0</Kr>
<Euro>0</Euro>
<DataType>ClassicoTableA</DataType>
</item>
<item>
<ID>100</ID>
<Name>ClassicoTable(102x100x140)</Name>
<Type>Model</Type>
<Kr>0</Kr>
<Euro>0</Euro>
<DataType>ClassicoTableB</DataType>
</item>
......
</module>
</catagory id="0">
Okay found a solution. I started wondering why @Kim wanted a snippet from my xml. So it made me think that
Data.Root.Element()maybe wasnt the right way. So I tried withDescendants()instead, and that actually works. Why? I have no clue. Heres why:In another repo I have the
XDocument.load()in the constructor of the repo. I thought that would be good, because then I wouldnt have to repeat the same code in all the CRUD methods. But, as I wanted the xml dynamic, and the constructor doesnt accept parameters, I thought this way (original question) would be fine. Here the code from the “static” repo:And in my edit method of that repo:
And that works like I charm, even though im using
CubeData.Root.Elements("item"). Note:Elementsinsted ofDescendants. The structure of the xml files are identical.