Nischal Bhatt Ответов: 3

Как динамически добавить элементы XML для XML-файлов, сохраняя тот же формат, используя LINQ для XML-файле с#


Всем Привет,

Я пытаюсь добавить элементы в xml, сохраняя тот же формат xml-элементов.

У меня есть эта модель, созданная в 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; }
    }



У меня есть этот формат xml-файла, где мы можем использовать любое количество тегов среды в разделе среды

<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>



Я добавил этот блок кода ниже в 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");
        }



используя этот код, я могу добавлять элементы в том же формате, но хочу знать, как я могу сделать это динамически, если у меня есть больше сред для отображения с помощью foreach или for loop?

Может ли кто-нибудь помочь в достижении этого, это будет очень полезно.
Заранее спасибо

Что я уже пробовал:

Я попробовал в своем api контроллере использовать некоторую помощь по этой ссылке
Добавление элементов в xml - файл в C# - переполнение стека[^]

3 Ответов

Рейтинг:
2

RickZeeland

Я думаю что-то вроде этого:

x.Element("Environments").Add(new XElement("Environment", ... your data ... ));


Рейтинг:
15

Nischal Bhatt

Наконец-то получил свое решение, получив ожидаемый результат, использовал приведенный ниже код, чтобы исправить его в моем API-контроллере :

[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");
        }



Ниже приведен вызов метода GetEnvironments

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();
        }


Рейтинг:
1

Rajeev Panday

если я хорошо понял ваш вопрос, то у вас есть несколько сред в качестве входных данных от какого-то клиента и вы хотите добавить вот так.
если вы используете архитектуру клиент-сервер, то вы можете пометить этот элемент c# как контракт данных и элемент данных.
и отправьте данные структурным способом в объект из т. е. ProjectEnvironment, и когда вы вызываете метод(AddEnvironmentDetails) с этими входными данными , сначала де-сериализуйте свой xml, а затем добавьте этот объект в него, сериализуйте его обратно и сохраните.
это может быть просто подсказка для вас, но основная реализация-это то, как вы решите это сделать.


Nischal Bhatt

Привет Раджив,
Это понятно.
Вот в чем я застрял.
Если вы видите мою модель, XML-файл и код контроллера API C#, я вручную пишу элемент Environment, вместо этого мне нужен способ, с помощью которого я могу использовать цикл for или foreach для заполнения элемента Environment, который будет содержать любое количество элементов.