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();

オブジェクトを逆シリアル化するためのクラスを作成するのを手伝ってもらえますか?

私は次のクラスを試しました:

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 が null です。

逆シリアル化しようとしているオブジェクトが適切に構築されていないように感じます。誰かがオブジェクトの構築を手伝ってくれませんか?

4

2 に答える 2

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' has不完全なコンテンツ。予想される可能な要素のリスト: 'UpdateIndicator'.".

したがって、最初にこの XSD に対して XML を有効にする必要があると思います。

于 2013-01-23T17:52:33.483 に答える
0

指定された XSD ファイルを使用して、C# クラスを自動的に作成できます。そのため、コマンド ライン ツール xsd.exe を使用できます。

xsd.exe の詳細については、http://msdn.microsoft.com/en-us/library/x6c1kb0s%28v=vs.110%29.aspxを参照してください。xsd ツールは、http: //msdn.microsoft.com/en-gb/windows/bb980924.aspx?wt.svl =more_downloadsからダウンロードできる Windows SDK に含まれています。インストールされている場合は、「C:\Program Files\Microsoft SDKs\Windows\{version}\bin」にあります。

逆シリアル化するには、既存のコードを使用できます。

于 2013-01-23T20:32:48.590 に答える