1

C# コードで以下の XML を動的に生成する必要がある状況があります。たとえば、XML テキストは次のようになります。

<Envelope>
  <Body>
    <Login>
      <USERNAME>username</USERNAME>
      <PASSWORD>Sm@rt123</PASSWORD>
    </Login>
  </Body>
</Envelope>

要件は、上記の XML 形式を文字列として API 呼び出しに送信することです。これにより、一部の応答が XML 形式の文字列として取得されます。

私の質問は、上記の例はログイン API 呼び出しの場合です。すべての API 呼び出しについて、要素 Envelope と Body は同じであり、API 呼び出しに基づいており、他の部分はログイン API のように変更されます。属性のユーザー名とパスワードを使用してログインします。

これまで、上記の文字列をハードコーディングし、機能が正常に動作するかどうかをテストしようとしていましたが、それぞれの異なる API 呼び出しに対してこれらのタグを生成するこのプロセスを自動化する必要があります。これを行う方法と、同じための最良のアプローチは何かを知る必要があります。

4

4 に答える 4

4

このような流暢なもの...

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;
    }
}
于 2012-05-22T16:04:39.403 に答える
2
/// <summary>
///   Create an xml string in the expected format for the login API call.
/// </summary>
/// <param name="user">The user name to login with.</param>
/// <param name="password">The password to login with.</param>
/// <returns>
///   Returns the string of an xml document with the expected schema, 
///   to use with the login API.
/// </returns>
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();
}
于 2012-05-22T15:58:14.500 に答える
1

wpf で c# コードを記述した場合、このコードは動的に 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

于 2012-06-09T05:06:06.207 に答える
0

XML に出力する簡単な方法としてシリアライゼーションを提案するつもりでした。簡単な例を次に示します。

最初にクラスを作成します

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
于 2012-05-22T16:13:19.083 に答える