C# 在C中解析XML字符串时获取空值#

C# 在C中解析XML字符串时获取空值#,c#,xml,c#-4.0,datacontractserializer,xml-deserialization,C#,Xml,C# 4.0,Datacontractserializer,Xml Deserialization,试图在C#中解析XML字符串,在SessionId中我得到的是空值。虽然将值设为近似值,但每次会话id都是空的。其他每个字段都会出现,并且被解析得非常好。我刚刚得到了会话id部分的空值。我也试着用JSON来做这件事,但没有做到。最后data.SessionId为null namespace EmailToActivityCreator { [DataContract] public class EmailInfo { [DataMember] public string Bod

试图在C#中解析XML字符串,在SessionId中我得到的是空值。虽然将值设为近似值,但每次会话id都是空的。其他每个字段都会出现,并且被解析得非常好。我刚刚得到了会话id部分的空值。我也试着用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>&lt;div dir=&quot;ltr&quot;&gt;body
&lt;/div&gt;
</Body>
<CCMail></CCMail>
<EmailState>Received</EmailState>
<FromEmail>Ravi Ranjan &lt;ravi.ranjan@xyz.com&gt;</FromEmail>
<Subject>subject</Subject>
<ToEmail> &lt;ravi@eras.in&gt;</ToEmail>
<SessionId>sss</SessionId>
</EmailInfo>"
”
div dir=“ltr”主体
/div
收到
拉维·兰扬·拉维。ranjan@xyz.com
主题
ravi@eras.in
sss
"

DataContractSerializer
要求XML中的元素与中的元素顺序相同。将忽略顺序错误的元素(,)。此处给出了默认顺序:

数据排序的基本规则包括:

  • 如果数据协定类型是继承层次结构的一部分,则其基类型的数据成员始终位于顺序的第一位

  • 下一个顺序是当前类型的数据成员,它们没有DataMemberAttribute属性集的order属性,按字母顺序排列

  • 接下来是具有DataMemberAttribute属性集的Order属性的任何数据成员。它们首先按Order属性的值排序,如果某个Order值有多个成员,则按字母顺序排序。可以跳过订单值

通过调用CompareOrdinal方法建立字母顺序

您可以使用属性指定遇到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,您必须自行实现(这是一个麻烦),或者切换到其他序列化程序,例如。

您的类是否具有SessionId属性?您的类缺少相应的属性。。。我没有看到任何
SessionId
。是的,我知道在这里我写了书面代码,我写了测试。但是在我的班上我没有。我的密码里有。反正我编辑了。我使用了另一个变量名并对其进行了实验。bt不起作用。@Arunster你知道吗??