Search code examples
c#xmllinqxmldocument

Variable value is null when I set XML value to null


My XML

<example>
      <ReferenceNumber xmlns="http://www.example.com/schemas/core/movement">
        <Mnemonic>LHH1</Mnemonic>
        <MovementProjectNumber>4743</MovementProjectNumber>
        <MovementVersion>5</MovementVersion>
      </ReferenceNumber>
</example>

// Get movement version value(5).

XDocument NewXML = XDocument.Parse(model.ReturnXML); // model.ReturnXML has XML as shown in above XML.
XNamespace ns = "http://www.example.com/schemas/core/movement";

var MovementVersionNew = from MovVer in NewXML.Root.Element(ns + "ReferenceNumber").Elements(ns + "MovementVersion")
                             select MovVer.Value.ToList().FirstOrDefault().ToString(); 

//Fetching the XML node part to update value of MovementVersion element.

var MovementVersionRef = (from MovVer in NewXML.Root.Elements(ns + "ReferenceNumber")
                                               select MovVer).ToList();

// Setting MovementVersion value as null.

foreach (XElement element in MovementVersionRef.Descendants())
{
    if (!element.HasElements)
    {
        if (element.Name.ToString().Contains("MovementVersion"))
        {
            element.SetValue("");
        }
    }    
}    

This above code will set MovementVersion value to null(in NewXML) that is correct but at the same time it is also changing value of MovementVersionNew variable(I don't want this change from 5 to null).

What can I change or use for not changing my old value because I want that value later in the code. Please help me. Thanks in Advance.


Solution

  • Call ToList() on MovementVersionNew's query.

    static void Main(string[] args)
    {
        var xmlstr = 
            @"<example>
                <ReferenceNumber xmlns='http://www.example.com/schemas/core/movement'>
                <Mnemonic>LHH1</Mnemonic>
                <MovementProjectNumber>4743</MovementProjectNumber>
                <MovementVersion>5</MovementVersion>
                </ReferenceNumber>
             </example>";
    
        XNamespace ns = "http://www.example.com/schemas/core/movement";
        var xml = XDocument.Parse(xmlstr);    
    
        var MovementVersionNew = (from MovVer in xml.Root.Element(ns + "ReferenceNumber").Elements(ns + "MovementVersion")
                                    select MovVer.Value.ToList().FirstOrDefault().ToString()).ToList();
    
        var MovementVersionRef = (from MovVer in xml.Root.Elements(ns + "ReferenceNumber")
                                    select MovVer).ToList();
    
        foreach (XElement element in MovementVersionRef.Descendants())
        {
            if (!element.HasElements)
            {
                if (element.Name.ToString().Contains("MovementVersion"))
                {
                    element.Value = String.Empty;
                }
            }
        }
    
        MovementVersionNew.ForEach(Console.WriteLine); //Prints "5"
        MovementVersionRef.ForEach(Console.WriteLine);
    
    }