尝试在C#中解析XML String,在SessionId中我得到空值。在调整值时,一切正常,只是会话ID每次都为空。所有其他领域即将到来,并且正在被很好地解析。我刚刚使用会话ID部分获得了null值。我试图用JSON做到这一点,但它没有完成。最后data.SessionId为null。
namespace EmailToActivityCreator
{
[DataContract]
public class EmailInfo
{
[DataMember]
public string Body { get; set; }
[DataMember]
public string CCMail { get; set; }
[DataMember]
public string EmailState { get; set; }
[DataMember]
public string FromEmail { get; set; }
[DataMember]
public string ToEmail { get; set; }
[DataMember]
public string Subject { get; set; }
[DataMember]
public string SessionId { get; set; }
}
class Program
{
static void Main(string[] args)
{
String arguments = args[0];
//Console.Error.Write(arguments);
var bytes = Encoding.UTF8.GetBytes(arguments);
EmailInfo data;
using (var stream = new MemoryStream(bytes))
{
DataContractSerializer serializer = new DataContractSerializer(typeof(EmailInfo));
data = (EmailInfo)serializer.ReadObject(stream);
}
我们传递的值是这样的
"<EmailInfo xmlns=\"http://schemas.datacontract.org/2004/07/ABC\">
<Body><div dir="ltr">body
</div>
</Body>
<CCMail></CCMail>
<EmailState>Received</EmailState>
<FromEmail>Ravi Ranjan <ravi.ranjan@xyz.com></FromEmail>
<Subject>subject</Subject>
<ToEmail> <ravi@eras.in></ToEmail>
<SessionId>sss</SessionId>
</EmailInfo>"
答案 0 :(得分:1)
DataContractSerializer
要求 XML中的元素与data member order中的data contract的顺序相同。错误顺序的元素将被忽略(reference 1,reference 2)。此处给出了默认顺序:Data Member Order。
数据排序的基本规则包括:
如果数据协定类型是继承层次结构的一部分,则其基本类型的数据成员始终位于订单中。
接下来依次是当前类型的数据成员,它们没有按字母顺序设置DataMemberAttribute属性的Order属性。
接下来是具有DataMemberAttribute属性集的Order属性的任何数据成员。它们首先按Order属性的值排序,然后按字母顺序排序,如果某个Order值有多个成员。可以跳过订单值。
通过调用CompareOrdinal方法建立字母顺序。
您可以使用DataMemberAttribute.Order
属性指定遇到XML元素的顺序:
[DataContract(Namespace="http://schemas.datacontract.org/2004/07/ABC")] // The namespace you used.
public class EmailInfo
{
[DataMember(Order = 1)]
public string Body { get; set; }
[DataMember(Order = 2)]
public string CCMail { get; set; }
[DataMember(Order = 3)]
public string EmailState { get; set; }
[DataMember(Order = 4)]
public string FromEmail { get; set; }
[DataMember(Order = 6)]
public string ToEmail { get; set; }
[DataMember(Order = 5)]
public string Subject { get; set; }
[DataMember(Order = 7)]
public string SessionId { get; set; }
}
如果您的代码需要以任何顺序读取带有元素的XML,您必须自己实现IXmlSerializable
(令人讨厌),或者切换到另一个序列化程序,例如XmlSerializer
。