Click here to Skip to main content
15,890,382 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hello Everyone,

I am trying to append the items to xml keeping the same format of the xml items.

I have this model created in C#.

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
    public class ProjectEnvironment
    {
        [XmlElement(ElementName = "ProjectId")]
        public int ProjectId { get; set; }

        [XmlElement(ElementName = "ProjectName")]
        public string ProjectName { get; set; }

        [XmlElement(ElementName = "ProjectApIUrl")]
        public string ProjectApIUrl { get; set; }

        [XmlElement(ElementName = "ProjectUrl")]
        public string ProjectUrl { get; set; }
        public List<Environment> Environments { get; set; }
    }

    public class Environment
    {
        [XmlElement(ElementName = "EnvId")]
        public string EnvId { get; set; }

        [XmlElement(ElementName = "EnvName")]
        public string EnvName { get; set; }
    }
C#



I have this xml file format, where we can any number of Environment tags under Environments

<ProjectEnvironment>
   <ProjectId>584</ProjectId>
   <ProjectName>ToolsProject</ProjectName>
   <ProjectApIUrl>https://testapi.example.com/api/v4/projects/584/deployments</ProjectApIUrl>
   <ProjectUrl>https://testapi.example.com/buyer/tools/Tools/API</ProjectUrl>
   <Environments>
     <Environment>
       <EnvId>3814</EnvId>
       <EnvName>SiT</EnvName>
     </Environment>
     <Environment>
       <EnvId>3786</EnvId>
       <EnvName>E1</EnvName>
     </Environment>
     <Environment>
       <EnvId>4038</EnvId>
       <EnvName>E2</EnvName>
     </Environment>
     <Environment>
       <EnvId>4039</EnvId>
       <EnvName>E3</EnvName>
     </Environment>
     <Environment>
       <EnvId>4040</EnvId>
       <EnvName>E4</EnvName>
     </Environment>
     <Environment>
       <EnvId>4041</EnvId>
       <EnvName>PERF</EnvName>
     </Environment>
   </Environments>
 </ProjectEnvironment>
HTML



I have added this below block of code in MVC API controller.
public void AddEnvironmentDetails()
        {
            XDocument _XDocument = XDocument.Load(@"C:\Content\test.xml");

            _XDocument.Element("ProjectEnvironments").Add(
            new XElement("ProjectEnvironment",
            new XElement("ProjectId", "584"),
            new XElement("ProjectName", "PremierTools"),
            new XElement("ProjectApIUrl", "https://test.example.com/api/v4/projects/584/deployments"),
            new XElement("ProjectUrl", "https://test.exmple.com/Tools/API"),
                new XElement("Environments",
                    new XElement("Environment",
                        new XElement("EnvId", "3814"),
                        new XElement("EnvName", "SiT")

            ),
            new XElement("Environment",
                            new XElement("EnvId", "3786"),
                            new XElement("EnvName", "E1")
            ),
            new XElement("Environment",
                            new XElement("EnvId", "4038"),
                            new XElement("EnvName", "E2")
            ),
             new XElement("Environment",
                            new XElement("EnvId", "4039"),
                            new XElement("EnvName", "E3")
            ),
             new XElement("Environment",
                            new XElement("EnvId", "4040"),
                            new XElement("EnvName", "E4")
            ),
             new XElement("Environment",
                            new XElement("EnvId", "4041"),
                            new XElement("EnvName", "PERF")
            )

            )));

            //var a = _XDocument.ToString();
            _XDocument.Save(@"C:\Content\test.xml");
        }
C#



using this code I am able to append the items keeping the same format, but want to know how can I do it dynamically If I have more environments to show using either foreach or for loop?

Could anyone help in achieving this, it will be of great help.
Thanks in advance

What I have tried:

I have tried in my api controller using some help from this link
Adding elements to an xml file in C# - Stack Overflow[^]
Posted
Updated 9-Dec-19 1:32am
v3

I think something like this:
x.Element("Environments").Add(new XElement("Environment", ... your data ... ));
 
Share this answer
 
Finally got my solution, getting the expected output, used the below code to fix it in my API Controller :

[HttpGet]
        [Route("api/AddProjectEnvironmentDetails")]
        public void AddProjectEnvironmentDetails()
        {
            //Load the Document
            XDocument _XDocument = XDocument.Load(@"C:\test.xml");

            //Create XML Elements
            _XDocument.Element("ProjectEnvironments").Add(
            new XElement("ProjectEnvironment",
            new XElement("ProjectId", "584"),
            new XElement("ProjectName", "Tools"),
            new XElement("ProjectApIUrl", "https://test.example.com/api/v4/projects/584/deployments"),
            new XElement("ProjectUrl", "https://test.example.com/Tools/API"),
                new XElement("Environments",
                        GetEnvironments())
                        ));
            //Save the Document after appending the xml
            _XDocument.Save(@"C:\Revenants\GitlabRnD\Gitlab\Gitlab\Content\test.xml");
        }
C#



Below is the GetEnvironments method Call

List<XElement> GetEnvironments()
        {
            _Environments.Add(new Models.Environment { EnvId = "3814", EnvName = "SIT" });
            _Environments.Add(new Models.Environment { EnvId = "3786", EnvName = "G1" });
            _Environments.Add(new Models.Environment { EnvId = "4038", EnvName = "G2" });
            _Environments.Add(new Models.Environment { EnvId = "4039", EnvName = "G3" });
            _Environments.Add(new Models.Environment { EnvId = "4040", EnvName = "G4" });
            _Environments.Add(new Models.Environment { EnvId = "4041", EnvName = "PERF" });

            var _EnvironmentList = new List<XElement>();
            foreach (var _Environment in _Environments)
            {
                var Environment = new XElement("Environment");
                var EnvironmentId = new XElement("EnvId", _Environment.EnvId);
                Environment.Add(EnvironmentId);

                var EnvironmentName = new XElement("EnvName", _Environment.EnvName);
                Environment.Add(EnvironmentName);

                _EnvironmentList.Add(Environment);

            }
            return _EnvironmentList.ToList();
        }
C#

 
Share this answer
 
if i understood your question well, you have multiple environments as input from some client and wants to add like this.
if you are using client-server architecture then you can mark this c# member as data contract and data member.
and send the data in strucure way in object from i.e. ProjectEnvironment, and when you call the method(AddEnvironmentDetails) with these input , first de-serialize your xml and then add this object into and serialize it back and save it.
this could be just hint for you but main implementation is how you decide to do it.
 
Share this answer
 
Comments
Nischal Bhatt 7-Dec-19 9:35am    
Hi Rajeev,
That is understood.
Here's What I'm stuck at.
If you see my Model, XML file and the C# api controller code, I am manually writing the Environment element, instead what I want is, a way where I can use either for or foreach loop to populate the Environment Element which will have any numbers of items in it.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900