Нужен подход для динамического генерации XML

У меня есть ситуация, когда мне нужно динамически генерировать ниже XML в моем коде C #. Например, текст XML будет

   username Sm@rt123    

Требование состоит в том, чтобы отправить вышеуказанный формат XML в виде строки в вызов API, который получит некоторые ответы в виде строки в формате XML.

Мой вопрос заключается в том, что приведенный выше пример для вызова Api для входа во все вызовы api: элементы Envelope и Body одинаковы и основаны на вызове api, другие части меняются так же, как и для Login api. Мне нужно указать элемент xml as Введите имя пользователя и пароль.

До сих пор я жестко кодировал вышеприведенную строку и пытался проверить, работает ли функция нормально, но теперь мне нужно автоматизировать этот процесс генерации этих тегов для соответствующих различных вызовов api. Мне нужно знать, как это можно сделать и каков наилучший подход для этого.

Я собирался предложить сериализацию как простой способ вывода в XML. Вот простой пример:

Сначала создайте classы

 Public Class Login Public Property USERNAME() As String Get Return _USERNAME End Get Set(ByVal value As String) _USERNAME = value End Set End Property Private _USERNAME As String Public Property PASSWORD() As String Get Return _PASSWORD End Get Set(ByVal value As String) _PASSWORD = value End Set End Property Private _PASSWORD As String End Class Public Class Body Public Property Login() As Login Get Return _login End Get Set(ByVal value As LoginClass) _login = value End Set End Property Private _login As Login = New Login() End Class Public Class Envelope Public Property Body() As Body Get Return _body End Get Set(ByVal value As Body) _body = value End Set End Property Private _body As Body = New Body() End Class 

Затем создайте объект конверта, заселите его и сериализуйте его:

 Dim envelope As New Envelope() envelope.Body.Login.USERNAME = "username" envelope.Body.Login.PASSWORD = "Sm@rt123" Dim stream As MemoryStream = New MemoryStream() Dim textWriter As XmlTextWriter = New XmlTextWriter(stream, New System.Text.UTF8Encoding(False)) Dim serializer As XmlSerializer = New XmlSerializer(GetType(Envelope)) Dim namespaces As XmlSerializerNamespaces = New XmlSerializerNamespaces() namespaces.Add("", "") serializer.Serialize(textWriter, envelope, namespaces) Dim doc As XmlDocument = New XmlDocument() doc.LoadXml(Encoding.UTF8.GetString(stream.ToArray())) Dim xmlText As String = doc.SelectSingleNode("Envelope").OuterXml 

Что-то такое беглое …

 internal class Program { private static void Main(string[] args) { new API() .Begin() .Login("username", "password") .Send("someuri"); Console.ReadLine(); } } public class API { public static readonly XNamespace XMLNS = "urn:hello:world"; public static readonly XName XN_ENVELOPE = XMLNS + "Envelope"; public static readonly XName XN_BODY = XMLNS + "Body"; public XDocument Begin() { // this just creates the wrapper return new XDocument(new XDeclaration("1.0", Encoding.UTF8.EncodingName, "yes") , new XElement(XN_ENVELOPE , new XElement(XN_BODY))); } } public static class APIExtensions { public static void Send(this XDocument request, string uri) { if (request.Root.Name != API.XN_ENVELOPE) throw new Exception("This is not a request"); // do something here like write to an http stream or something var xml = request.ToString(); Console.WriteLine(xml); } } public static class APILoginExtensions { public static readonly XName XN_LOGIN = API.XMLNS + "Login"; public static readonly XName XN_USERNAME = API.XMLNS + "USERNAME"; public static readonly XName XN_PASSWORD = API.XMLNS + "PASSWORD"; public static XDocument Login(this XDocument request, string username, string password) { if (request.Root.Name != API.XN_ENVELOPE) throw new Exception("This is not a request"); // you can have some fancy logic here var un = new XElement(XN_USERNAME, username); var pw = new XElement(XN_PASSWORD, password); var li = new XElement(XN_LOGIN, un, pw); request.Root.Element(API.XN_BODY).Add(li); return request; } } 
 ///  /// Create an xml string in the expected format for the login API call. ///  /// The user name to login with. /// The password to login with. ///  /// Returns the string of an xml document with the expected schema, /// to use with the login API. ///  private static string GenerateXmlForLogin(string user, string password) { return new XElement("Envelope", new XElement("Body", new XElement("Login", new XElement("USERNAME", user), new XElement("PASSWORD", password)))).ToString(); } 

Если вы напишете код c # в wpf, этот код поможет вам динамически генерировать xml-файл.

 using System.Xml; public Window1() { this.InitializeComponent(); XmlDocument myxml = new XmlDocument(); XmlElement envelope_tag = myxml.CreateElement("Envelope"); XmlElement body_tag = myxml.CreateElement("Body"); envelope_tag.AppendChild(body_tag); XmlElement Login_tag=myxml.CreateElement("Login"); body_tag.AppendChild(Login_tag); XmlElement username = myxml.CreateElement("USERNAME"); username.InnerText = "username"; Login_tag.AppendChild(username); XmlElement password = myxml.CreateElement("PASSWORD"); password.InnerText = "rt123"; Login_tag.AppendChild(password); myxml.AppendChild(envelope_tag); myxml.Save(@"D:\Myxml.xml"); //you can save this file wherever you want to store. it may c: or D: and etc... } 

Результат будет таким:

MyXml