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

时间:2015-03-05 09:56:02

标签: c# xml c#-4.0 datacontractserializer xml-deserialization

尝试在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>&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>"

1 个答案:

答案 0 :(得分:1)

DataContractSerializer 要求 XML中的元素与data member order中的data contract的顺序相同。错误顺序的元素将被忽略reference 1reference 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