【问题标题】:Getting Null value while parsing the XML string in C#在 C# 中解析 XML 字符串时获取 Null 值
【发布时间】:2015-03-05 09:56:01
【问题描述】:

尝试在 C# 中解析 XML 字符串,在 SessionId 中我得到空值。在传递值时,一切都正确无误,每次只有会话 ID 为空。其他所有领域都即将到来并被很好地解析。我刚刚得到了带有会话 id 部分的空值。我也尝试用 JSON 来做到这一点,但它没有完成。最后 data.SessionId 为空。

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>"

【问题讨论】:

  • 你的班级有 SessionId 属性吗?
  • 您的课程缺少适当的属性...我没有看到任何SessionId
  • 是的,我知道这里的书面代码,我写了测试。但在我的课堂上我有
  • 没有。我在我的代码中有。反正我编辑了。我正在使用其他变量名称并对其进行试验。 bt 它不工作。
  • @Arunster 你有什么想法吗??

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多