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;}

我刚刚注意到的另一件事是您对 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 回答