0

我想将以下 XML 反序列化为 C# 中的对象类:

<?xml version="1.0" encoding="UTF-8"?>
    <ern:NewReleaseMessage xmlns:ern="http://ddex.net/xml/2010/ern-main/32"
                           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                           LanguageAndScriptCode="en"
                           xsi:schemaLocation="http://ddex.net/xml/2010/ern-main/32 http://ddex.net/xml/2010/ern-main/32/ern-main.xsd"
                           MessageSchemaVersionId="2010/ern-main/32">
<MessageHeader>
    <MessageThreadId>PADPID</MessageThreadId>
    <MessageId>PADPIDA</MessageId>
    <MessageSender>
      <PartyId>PADPIDA</PartyId>
      <PartyName>
        <FullName>Tes co</FullName>
      </PartyName>
    </MessageSender>
    <SentOnBehalfOf>
      <PartyId>PADPIDA</PartyId>
      <PartyName>
        <FullName>Bp</FullName>
      </PartyName>
    </SentOnBehalfOf>
    <MessageRecipient>
      <PartyId>PADPIDA</PartyId>
      <PartyName>
        <FullName>Testo</FullName>
      </PartyName>
    </MessageRecipient>
    <MessageCreatedDateTime>2012-10-31T19:26:05Z</MessageCreatedDateTime>
    <!-- Message type ern:NewReleaseMessage -->
    <!-- Message version 20110307 -->
    <!-- Generated using code version 2012102902 -->
  </MessageHeader>
 </ern:NewReleaseMessage>

这是我可能反序列化为名为 NewReleaseMessage 的对象的代码:

  var xmlstream = new FileStream(ConfigurationManager.AppSettings["xmlfilepath"],FileMode.Open,FileAccess.Read);
  var dcs = new XmlSerializer(typeof(NewReleaseMessage));
  var loadfile = (NewReleaseMessage)dcs.Deserialize(xmlstream);
  xmlstream.Close();

somoene 可以帮我创建类来反序列化对象吗?

我尝试了以下课程:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization;
using System.Xml;
using System.Xml.Serialization;
//using System.Runtime.Serializa

namespace Ddexcoverter2
{
    [Serializable]
    [XmlRoot(ElementName  = "NewReleaseMessage" , Namespace  = "http://ddex.net/xml/2010/ern-main/32")]
    public class NewReleaseMessage
    {
        [XmlElement]
        public MessageHeader MessageHeader { get; set; }

    }

    [Serializable]
    public class MessageHeader
    {
        [XmlElement]
        public string MessageThreadId { get; set; }
        [XmlElement]
        public string MessageId { get; set; }
        [XmlElement]
        public MessageSender Sender { get; set; }
    }


    [Serializable]
    public class MessageSender
    {
        [XmlElement]
        public string PartyId { get; set; }

    }

}

当我尝试运行程序时,对象 NewReleaseMessage 为空。

我有一种感觉,我试图反序列化的对象构造不正确。有人可以帮我构造对象吗?

4

2 回答 2

0

您可以使用给定的 XSD 文件自动创建 C# 类。因此,您可以使用命令行工具 xsd.exe。

有关 xsd.exe 的更多信息,请访问http://msdn.microsoft.com/en-us/library/x6c1kb0s%28v=vs.110%29.aspx。xsd 工具包含在 Windows SDK 中,可在此处下载:http: //msdn.microsoft.com/en-gb/windows/bb980924.aspx ?wt.svl=more_downloads 。如果已安装,可在此处找到:“C:\Program Files\Microsoft SDKs\Windows\{version}\bin”。

要反序列化,您可以使用现有代码。

于 2013-01-23T20:32:48.590 回答
0

它在 LanguageAndScriptCode 属性上失败。

 XmlSerializer serializer = new XmlSerializer(typeof(NewReleaseMessage));
 serializer.UnknownAttribute += serializer_UnknownAttribute;
 serializer.UnknownElement += serializer_UnknownElement;
 serializer.UnknownNode += serializer_UnknownNode;
 NewReleaseMessage message = (NewReleaseMessage)serializer.Deserialize(file);
 file.Close();

在 UnknownNode 处理程序中设置断点并亲自查看。

此外,当我粘贴 xml(并添加缺少的 ern:NewReleaseMessage 结束标记)时,VS 发出警告“命名空间 'http://ddex.net/xml/2010/ern-main/32' 中的元素 'NewReleaseMessage' 有内容不完整。预期的可能元素列表:“UpdateIndicator”。”。

所以我认为你需要首先使 XML 对这个 XSD 有效。

于 2013-01-23T17:52:33.483 回答