我想将值转换为带有字符串的对象。我的意思是让我说我的字符串里面有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>";
我有一个Class,它具有Xml中提到的所有属性,如
类ResponseClass
String UserName;
String Password;
String Transaction;
如何在没有字符串解析的情况下设置ResponseClass对象中的所有值? 我已尝试使用序列化,但由于API的限制,它在Windows 8.1应用商店项目中给了我一些问题。
有没有办法让它排序?
由于
答案 0 :(得分:1)
使用XDocument.Parse(String)
中的System.Xml.Linq
:
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;
}
答案 1 :(得分:0)
除非Xml是通过某个序列化程序生成的,否则您必须手动编码才能匹配。序列化和反序列化是齐头并进的。因此,如果您的xml文件是序列化程序的产品,则很可能是反序列化程序。如果您可以选择重新创建此xml文件,那么可以使用XmlSerializer这样做,这样就可以反序列化。
答案 2 :(得分:0)
如果您不想使用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
});
}