【问题标题】:Conversion from string to object in Windows 8.1 store app c#在 Windows 8.1 商店应用程序 c# 中从字符串转换为对象
【发布时间】:2014-01-14 00:29:08
【问题描述】:

我想将字符串转换为具有值的对象。我的意思是说我有一个字符串,里面有 XML 代码:

代码片段:

String response =@"<?xml version=""1.0"" encoding=""utf-8""?>\r\n
<Request>\r\n  
<TransactionType>ADMIN</TransactionType>\r\n   
<Username>abc</Username>\r\n  
<Password>def</Password>\r\n  
</Request>";

我有一个类,它具有 XML 中提到的所有属性,例如

类响应类

String UserName;

String Password;

String Transaction;

如何在没有字符串解析的情况下设置 ResponseClass 对象中的所有值? 我已经尝试过序列化,但由于 API 的限制,它在 windows 8.1 应用商店项目中给我带来了一些问题。

有什么办法可以排序吗?

谢谢

【问题讨论】:

标签: c# windows-8.1


【解决方案1】:

这是使用来自System.Xml.Linq 的XDocument.Parse(String) 的一种非常简单的方法:

String response = @"<?xml version=""1.0"" encoding=""utf-8""?>
    <Request> 
        <TransactionType>ADMIN</TransactionType>   
        <Username>abc</Username> 
        <Password>def</Password> 
    </Request>";

var xml = XDocument.Parse(response);
var request = xml.Element("Request");

var responseObject = new ResponseClass()
{
    UserName = request.Element("Username").Value,
    Password = request.Element("Password").Value,
    Transaction = request.Element("TransactionType").Value,
};

或者,如果 Windows 商店应用程序支持它,您可以使用内置的XmlSerializer(如果没有,您可以忽略此位)。只需使用 XmlRoot 和 XmlElement 属性定义您的类,如下所示:

[XmlRoot("Request")]
public class ResponseClass
{
    [XmlElement("Username")]
    public String UserName { get; set; }

    [XmlElement("Password")]
    public String Password { get; set; }

    [XmlElement("TransactionType")]
    public String Transaction { get; set; }
}

然后使用创建XmlSerializer 和StringReader 来反序列化它:

String response = @"<?xml version=""1.0"" encoding=""utf-8""?>
    <Request> 
        <TransactionType>ADMIN</TransactionType>   
        <Username>abc</Username> 
        <Password>def</Password> 
    </Request>";

var serializer = new XmlSerializer(typeof(ResponseClass));
ResponseClass responseObject;

using (var reader = new StringReader(response))
{
    responseObject = serializer.Deserialize(reader) as ResponseClass;
}

【讨论】:

    【解决方案2】:

    除非 Xml 是通过某些序列化程序生成的,否则您必须手动对其进行编码以匹配。序列化和反序列化齐头并进。因此,如果您的 xml 文件是序列化程序的产品,那么很可能会有一个反序列化程序。如果您可以选择重新创建此 xml 文件,请使用 XmlSerializer 执行此操作,这样您就可以反序列化。

    【讨论】:

      【解决方案3】:

      如果您不想使用XmlSerializer,那么这有点难看,但希望这对您的需求有所帮助。我已经为我的某些用途实现了类似的东西。先做一个扩展方法。

      public static class TextUtil
      {
           public static string JustAfter(this string Str, string Seq, string SeqEnd)
           {
              string Orgi = Str;
              try
              {
                  int i = Str.IndexOf(Seq);
      
                  if (i < 0)
                      return null;
      
                  i = i + Seq.Length;
      
                  int j = Str.IndexOf(SeqEnd, i);
                  int end;
      
                  if (j > 0) end = j - i;
                  else end = Str.Length - i;
      
                  return Orgi.Substring(i, end);
              }
              catch (Exception)
              {
                  return String.Empty;
              }
          }
      }
      

      现在您可以如图所示使用它了。

      private void ParseXml(string responce) // respnce is xml string.
      {
          string transactionType = responce.JustAfter("<TransactionType>", "</TransactionType>");
          string userName = responce.JustAfter("<Username>", "</UserName>");
          string password = responce.JustAfter("<Password>", "</Password>");
      
          ResponceClass resClass = new RespnceClass()
          {
              Transaction = transactionType,
              UserName = userName,
              Password = password
          });
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多