基于XSD生成的类文件反序列化XML字符串 [英] Deserialize an XML string based on class file generated with XSD

查看:79
本文介绍了基于XSD生成的类文件反序列化XML字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图基于XSD架构创建的类反序列化XML答案,但它始终返回null。

I am trying to deserialize an XML answer based on classes created by XSD schema but it always returns null.

XML文件具有这种格式

The XML file has this format

    <?xml version="1.0" encoding="utf-16"?>
<Responses xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Response>
        <inv_number>1</inv_number>
        <StatusCode>Success</StatusCode>
        <Uid>271D95D28716B37A330A5A476AE530206828B103</Uid>
        <Mark>1000000912965</Mark>
      </Response>
      <Response>
        <inv_number>2</inv_number>
        <StatusCode>ValidationError</StatusCode>
        <Errors>
          <Error>
            <Message>Author AFM is not the same with User AFM</Message>
            <Code>-1</Code>
          </Error>
        </Errors>
      </Response>
</Responses>

基于XSD架构(使用xsd.exe生成)的类文件是:

My class file based on XSD schema (generated with xsd.exe) is:

using System.Xml.Serialization;

// 
// This source code was auto-generated by xsd, Version=4.6.1055.0.
// 


/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class ResponseDoc {

    private ResponseType[] responseField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("response")]
    public ResponseType[] response {
        get {
            return this.responseField;
        }
        set {
            this.responseField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class ResponseType {

    private int entitylineNumberField;

    private string statusCodeField;

    private object[] itemsField;

    /// <remarks/>
    public int entitylineNumber {
        get {
            return this.entitylineNumberField;
        }
        set {
            this.entitylineNumberField = value;
        }
    }

    /// <remarks/>
    public string statusCode {
        get {
            return this.statusCodeField;
        }
        set {
            this.statusCodeField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("entityMark", typeof(long))]
    [System.Xml.Serialization.XmlElementAttribute("entityUid", typeof(string))]
    [System.Xml.Serialization.XmlElementAttribute("errors", typeof(ResponseTypeErrors))]
    public object[] Items {
        get {
            return this.itemsField;
        }
        set {
            this.itemsField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class ResponseTypeErrors {

    private ErrorType[] errorField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("error")]
    public ErrorType[] error {
        get {
            return this.errorField;
        }
        set {
            this.errorField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class ErrorType {

    private string messageField;

    private int codeField;

    /// <remarks/>
    public string message {
        get {
            return this.messageField;
        }
        set {
            this.messageField = value;
        }
    }

    /// <remarks/>
    public int code {
        get {
            return this.codeField;
        }
        set {
            this.codeField = value;
        }
    }
}

我反序列化XML的代码答案是

My code of deserialize the XML answer is

XmlSerializer serializer = new XmlSerializer(typeof(ResponseType),new XmlRootAttribute("Responses"));
ResponseType resultingResponse = (ResponseType)serializer.Deserialize(new StringReader(result));

如果我不输入


新的XmlRootAttribute( Responses)

new XmlRootAttribute("Responses")

它给了我一个例外

system.invalidOperaionException  <Responses xmlns=''> was not expected.

如果我使用它,只会给我带来空洞的结果。
我也尝试删除

If I use it it just gives me empty results. I also tried deleting the


[System.Xml.Serialization.XmlRootAttribute(Namespace =,IsNullable = false)]

[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]

根据建议此处

推荐答案

尝试以下操作:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            StreamReader sReader = new StreamReader(FILENAME);
            //read past the unicode in first line
            sReader.ReadLine();

            XmlReader reader = XmlReader.Create(sReader);

            XmlSerializer serializer = new XmlSerializer(typeof(ResponseDoc));
            ResponseDoc responseDoc = (ResponseDoc)serializer.Deserialize(reader);
        }
    }
    [XmlRoot(ElementName = "Responses", Namespace = "")]
    public partial class ResponseDoc
    {

        private ResponseType[] responseField;

        /// <remarks/>
        [System.Xml.Serialization.XmlElement(ElementName = "Response", Namespace = "")]
        public ResponseType[] response
        {
            get
            {
                return this.responseField;
            }
            set
            {
                this.responseField = value;
            }
        }
    }

    [XmlRoot(ElementName = "Response", Namespace = "")]
    public partial class ResponseType
    {

        private int entitylineNumberField;

        private string statusCodeField;

        private string uid;

        private long entityMark;


        private ResponseTypeErrors[] responseTypeErrors;

        /// <remarks/>
        [XmlElement(ElementName = "inv_number", Namespace = "")]
        public string entitylineNumber
        {
            get
            {
                return this.entitylineNumberField.ToString();
            }
            set
            {
                this.entitylineNumberField = int.Parse(value);
            }
        }

        /// <remarks/>
        [XmlElement(ElementName = "StatusCode", Namespace = "")]
        public string statusCode
        {
            get
            {
                return this.statusCodeField;
            }
            set
            {
                this.statusCodeField = value;
            }
        }

        [XmlElement(ElementName = "Uid", Namespace = "")]
        public string Uid
        {
            get
            {
                return this.uid;
            }
            set
            {
                this.uid = value;
            }
        }


        [XmlElement(ElementName = "entityMark", Namespace = "")]
        public string EntityMark
        {
            get
            {
                return this.entityMark.ToString();
            }
            set
            {
                this.entityMark = long.Parse(value);
            }
        }
        [XmlElement(ElementName = "Errors", Namespace = "")]
        public ResponseTypeErrors[] Errors
        {
            get
            {
                return this.responseTypeErrors;
            }
            set
            {
                this.responseTypeErrors = value;
            }
        }
    }

    [XmlRoot(ElementName = "Errors", Namespace = "")]
    public partial class ResponseTypeErrors
    {

        private ErrorType[] errorField;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("Error")]
        public ErrorType[] error
        {
            get
            {
                return this.errorField;
            }
            set
            {
                this.errorField = value;
            }
        }
    }

    [XmlRoot(ElementName = "Error", Namespace = "")]
    public partial class ErrorType
    {

        private string messageField;

        private int codeField;

        /// <remarks/>
        [XmlElement(ElementName = "Message", Namespace = "")]
        public string message
        {
            get
            {
                return this.messageField;
            }
            set
            {
                this.messageField = value;
            }
        }

        /// <remarks/>
        [XmlElement(ElementName = "Code", Namespace = "")]
        public int code
        {
            get
            {
                return this.codeField;
            }
            set
            {
                this.codeField = value;
            }
        }
    }

}

这篇关于基于XSD生成的类文件反序列化XML字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆