0

XML ドキュメントを ac# DataContract にデシリアライズしようとしていますが、エラーが発生します。

エラーメッセージは次のとおりです。

行 2 の位置 2 にエラーがあります。名前空間 'http://ddex.net/xml/2010/ern-main/32' から要素 'Ernmxml' を予期しています..名前 'NewReleaseMessage'、名前空間 'http:/ /ddex.net/xml/2010/ern-main/32'

私はまだ DataContract 全体を完了していませんが、これまでのところ次のとおりです。

namespace DdexCoverter
{
    [DataContract]
    public class Ernmxml
    {

        [IgnoreDataMemberAttribute] public string NewReleaseMessage;
        [DataMember] public string PartId;

    }
}

ここに私のメインプログラムがあります:

   class Program
    {
        static void Main(string[] args)
        {
            FileStream xmlstream = File.OpenRead(ConfigurationManager.AppSettings["xmlfilepath"]);
            var xr = new XmlTextReader(ConfigurationManager.AppSettings["xmlfilepath"]);

            var ddexxml =  new Ernmxml();

            var dcs = new DataContractSerializer(typeof(Ernmxml));

            var ernmobj = (Ernmxml) dcs.ReadObject(xr);



        }
    }
}

エラーは次の行で生成されます: var ernmobj = (Ernmxml) dcs.ReadObject(xr);

XML の冒頭は次のようになります。

<?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>PADPIDA</MessageThreadId>
    <MessageId>PADPIDA</MessageId>
    <MessageSender>
      <PartyId>PADPIDA</PartyId>
      <PartyName>

誰かがこのエラーを解決する方法を教えてもらえますか?

4

2 に答える 2

0

DataMemberは、単なるパブリックフィールドとして定義されています。DataMemberとXmlSerializerは、パブリックプロパティでのみ機能します。オブジェクトモデルは、XMLのオブジェクトモデルとも一致する必要があります。私がそれを正しくリバースエンジニアリングした場合、これはあなたが得るべきものです:

    [DataContract]
    public class MessageHeader
    {
        [DataMember]
        public string MessageThreadId { get; set; }
        [DataMember]
        public string MessageId { get; set; }
        [DataMember]
        public MessageSender sender { get; set; }
    }
    [DataContract]
    public class MessageSender
    {
        [DataMember]
        public string PartyId { get; set; }
    }

私は通常、クラス定義から始めて、オブジェクトをシリアル化して、フォーマットがどのように見えるかを確認します。xmlのリバースエンジニアリングに慣れていません。:)

次に、これをNewReleaseMessageクラス内に配置する必要があります。

    MessageHeader message {get;set;}

私が今気付いたもう1つのことは、DataContractSerializerの使用です。これを行うだけです:

    using ( FileStream stream = File.OpenRead(pathToFile))
    {
        XmlSerializer ser = new XmlSerializer(typeof(NewReleaseMessage));
        NewRealeaseMessage data = ser.Deserialize(stream) as NewReleaseMessage;
        return data;
    }
于 2013-01-15T20:06:23.330 に答える
0

変化する

 public class Ernmxml

public class NewReleaseMessage 

また

変化する

<ern:NewReleaseMessage xmlns:ern="http://ddex.net/xml/2010/ern-main/32"

また

<ern:Ernmxml xmlns:ern="http://ddex.net/xml/2010/ern-main/32"
于 2013-01-15T19:37:10.010 に答える