为WCF服务反序列化C#中的简单XML数组对象

为WCF服务反序列化C#中的简单XML数组对象,c#,xml,wcf,xsd,deserialization,C#,Xml,Wcf,Xsd,Deserialization,三天来我一直面临着同样的问题,我不知道我做错了什么 上下文:我正在为固定XML创建一个新的WCF服务 问题:看起来XML的反序列化出错了。我确实得到了数据对象,但没有填充属性项 迄今为止: 使用XSD4.0(目前在WCF项目中使用)和4.7创建C#类 添加多个属性,如: [ServiceContract(Namespace = "urn:oasis:names:tc:SPML:2:0"), XmlSerializerFormat]. [System.Xml.Serialization.XmlA

三天来我一直面临着同样的问题,我不知道我做错了什么

上下文:我正在为固定XML创建一个新的WCF服务

问题:看起来XML的反序列化出错了。我确实得到了
数据
对象,但没有填充属性

迄今为止:

  • 使用XSD4.0(目前在WCF项目中使用)和4.7创建C#类
  • 添加多个属性,如:

    [ServiceContract(Namespace = "urn:oasis:names:tc:SPML:2:0"), XmlSerializerFormat].
    [System.Xml.Serialization.XmlArrayItemAttribute("attr", IsNullable = false)] 
    
    属性

这是我将要接收的xml:

<spml:data xmlns:spml="urn:oasis:names:tc:SPML:2:0">
    <attr name="mailone" xmlns="urn:oasis:names:tc:DSML:2:0:core">
        <value>xxxx@gmail.com</value>
    </attr>
    <attr name="mailtwo" xmlns="urn:oasis:names:tc:DSML:2:0:core">
        <value>xxxx@gmail.com</value>
    </attr>
    <attr name="mailthree" xmlns="urn:oasis:names:tc:DSML:2:0:core">
        <value>xxxx@gmail.com</value>
    </attr>
</spml:data>
如果您在同一项目中使用C类运行此控制台应用程序并对数据进行调试,您将获得一个带有
items=null
的数据对象

有人能把我引向正确的方向吗

编辑:这与名称空间有关:我删除了XML和c#对象中的所有名称空间,它成功了

亲切问候,,
彼得

下面的代码可以工作。我更改了名称空间:

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

namespace ConsoleApplication137
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XmlReader reader = XmlReader.Create(FILENAME);
            XmlSerializer serializer = new XmlSerializer(typeof(data));
            data d = (data)serializer.Deserialize(reader);
        }

    }
    [System.Xml.Serialization.XmlRootAttribute(Namespace = "urn:oasis:names:tc:SPML:2:0", IsNullable = false)]
    public partial class data
    {
        private attr[] itemsField;

        /// <remarks/>
        [XmlElement(ElementName = "attr", Namespace = "urn:oasis:names:tc:DSML:2:0:core")]
        public attr[] Items
        {
            get
            {
                return this.itemsField;
            }
            set
            {
                this.itemsField = value;
            }
        }
    }

    [System.Xml.Serialization.XmlRootAttribute(Namespace = "urn:oasis:names:tc:DSML:2:0:core", IsNullable = false)]
    public partial class attr
    {

        private string valueField;

        private string nameField;

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string name
        {
            get
            {
                return this.nameField;
            }
            set
            {
                this.nameField = value;
            }
        }
    }

}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Serialization;
命名空间控制台应用程序137
{
班级计划
{
常量字符串文件名=@“c:\temp\test.xml”;
静态void Main(字符串[]参数)
{
XmlReader=XmlReader.Create(文件名);
XmlSerializer serializer=新的XmlSerializer(类型(数据));
数据d=(数据)序列化程序。反序列化(读取器);
}
}
[System.Xml.Serialization.XmlRootAttribute(Namespace=“urn:oasis:names:tc:SPML:2:0”,IsNullable=false)]
公共部分类数据
{
私有属性[]项字段;
/// 
[xmlement(ElementName=“attr”,Namespace=“urn:oasis:names:tc:DSML:2:0:core”)]
公共属性[]项
{
得到
{
返回此.itemsField;
}
设置
{
this.itemsField=值;
}
}
}
[System.Xml.Serialization.XmlRootAttribute(Namespace=“urn:oasis:names:tc:DSML:2:0:core”,IsNullable=false)]
公共部分类属性
{
私有字符串值字段;
私有字符串名称字段;
/// 
公共字符串值
{
得到
{
返回此.valueField;
}
设置
{
this.valueField=值;
}
}
/// 
[System.Xml.Serialization.XmlAttributeAttribute()]
公共字符串名
{
得到
{
返回此.nameField;
}
设置
{
this.nameField=值;
}
}
}
}

我刚刚测试了这个,它成功了。令我惊讶的是,我用visualstudio中的特殊粘贴将xml转换为类,它给了我一个同样有效的类。xsd工具中出现了一些问题。我学到的是:我完全信任xsd生成的文件,并不认为这是一个错误。下次我会更挑剔。。。谢谢你帮我
using System;
using System.Xml;
using System.Xml.Serialization;

namespace XmlDeserializer
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlSerializer ser = new XmlSerializer(typeof(data));
            data data;

            using (XmlReader reader = XmlReader.Create(PATH))
            {
                data = (data)ser.Deserialize(reader);
            }
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApplication137
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XmlReader reader = XmlReader.Create(FILENAME);
            XmlSerializer serializer = new XmlSerializer(typeof(data));
            data d = (data)serializer.Deserialize(reader);
        }

    }
    [System.Xml.Serialization.XmlRootAttribute(Namespace = "urn:oasis:names:tc:SPML:2:0", IsNullable = false)]
    public partial class data
    {
        private attr[] itemsField;

        /// <remarks/>
        [XmlElement(ElementName = "attr", Namespace = "urn:oasis:names:tc:DSML:2:0:core")]
        public attr[] Items
        {
            get
            {
                return this.itemsField;
            }
            set
            {
                this.itemsField = value;
            }
        }
    }

    [System.Xml.Serialization.XmlRootAttribute(Namespace = "urn:oasis:names:tc:DSML:2:0:core", IsNullable = false)]
    public partial class attr
    {

        private string valueField;

        private string nameField;

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

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string name
        {
            get
            {
                return this.nameField;
            }
            set
            {
                this.nameField = value;
            }
        }
    }

}