C# 基于用XSD生成的类文件反序列化XML字符串

C# 基于用XSD生成的类文件反序列化XML字符串,c#,xml,xsd,deserialization,C#,Xml,Xsd,Deserialization,我试图基于XSD模式创建的类反序列化XML答案,但它总是返回null XML文件具有这种格式 <?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> <i

我试图基于XSD模式创建的类反序列化XML答案,但它总是返回null

XML文件具有这种格式

    <?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生成)的我的类文件是:

如果我不把

新的XmlRootAttribute(“响应”)

这给了我一个例外

system.invalidOperaionException  <Responses xmlns=''> was not expected.
system.InvalidoPeriationException不应出现。
如果我使用它,它只会给我空的结果。 我还尝试删除

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

}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Serialization;
使用System.IO;
命名空间控制台应用程序1
{
班级计划
{
常量字符串文件名=@“c:\temp\test.xml”;
静态void Main(字符串[]参数)
{
StreamReader sReader=新的StreamReader(文件名);
//读取第一行中的unicode
sReader.ReadLine();
XmlReader=XmlReader.Create(sReader);
XmlSerializer serializer=新的XmlSerializer(typeof(ResponseDoc));
ResponseDoc ResponseDoc=(ResponseDoc)序列化程序。反序列化(读取器);
}
}
[XmlRoot(ElementName=“Responses”,Namespace=”“)]
公共部分类响应
{
私人ResponseType[]responseField;
/// 
[System.Xml.Serialization.xmlement(ElementName=“Response”,Namespace=”“)]
公共响应类型[]响应
{
收到
{
返回此.responseField;
}
设置
{
this.responseField=值;
}
}
}
[XmlRoot(ElementName=“Response”,Namespace=”“)]
公共部分类响应类型
{
私有int entitylineNumberField;
私有字符串statusCodeField;
私有字符串uid;
私人长实体马克;
私人responseypeerrors[]responseypeerrors;
/// 
[xmlement(ElementName=“inv_number”,Namespace=”“)]
公共字符串entitylineNumber
{
收到
{
返回此.entitylineNumberField.ToString();
}
设置
{
this.entitylineNumberField=int.Parse(值);
}
}
/// 
[xmlement(ElementName=“StatusCode”,Namespace=”“)]
公共字符串状态码
{
收到
{
返回此.statusCodeField;
}
设置
{
this.statusCodeField=值;
}
}
[xmlement(ElementName=“Uid”,Namespace=”“)]
公共字符串Uid
{
收到
{
返回这个.uid;
}
设置
{
this.uid=值;
}
}
[xmlement(ElementName=“entityMark”,Namespace=”“)]
公共字符串实体标记
{
收到
{
返回此.entityMark.ToString();
}
设置
{
this.entityMark=long.Parse(值);
}
}
[xmlement(ElementName=“Errors”,Namespace=”“)]
公共响应对等错误[]错误
{
收到
{
返回此。responseTypeErrors;
}
设置
{
this.responseTypeErrors=值;
}
}
}
[XmlRoot(ElementName=“Errors”,Namespace=”“)]
公共部分类响应对等错误
{
私有ErrorType[]errorField;
/// 
[System.Xml.Serialization.xmlementAttribute(“错误”)]
公共错误类型[]错误
{
收到
{
返回此.errorField;
}
设置
{
this.errorField=值;
}
}
}
[XmlRoot(ElementName=“Error”,Namespace=”“)]
公共部分类错误类型
{
私有字符串消息字段;
私有int码域;
/// 
[xmlement(ElementName=“Message”,Namespace=”“)]
公共字符串消息
{
收到
{
返回此.messageField;
}
设置
{
this.messageField=值;
}
}
/// 
[xmlement(ElementName=“Code”,Namespace=”“)]
公共整数码
{
收到
{
返回此.codeField;
}
设置
{
this.codeField=值;
}
}
}
}

我的文件中没有XML,但当我放入字符串而不是文件名时,它会引发参数异常“路径中的非法字符。”如果我尝试使用外部XML文件,而您的XSD架构正在工作,但它没有返回entityMark。对于我的代码,这是XSD生成的类还是XML文件本身的问题?我更新了代码以添加实体标记。我认为它与xsd文件有关。xsd没有生成与Xml文件兼容的类。因此,它可以是Xml或Xsd。但是看看生成的代码:public object[]Items(以及代码上方的属性),它看起来是错误的。我从来没有见过“entityMark”(长)、“entityUid”(字符串)和“errors”(类数组)组合成一种类型。xsd.exe使用xsd文件中的指令将这三个对象放入类中的一个属性中。所以我认为XSD是错误的,调试xml反序列化非常困难。c#生成的错误消息没有给出正确的信息。通常,我必须对类属性(或xml)进行注释和取消注释,以找出问题所在。我
system.invalidOperaionException  <Responses xmlns=''> was not expected.
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;
            }
        }
    }

}