Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将XML反序列化为具有C中对象列表的对象#_C#_Xml_Xmlserializer_Xml Deserialization - Fatal编程技术网

C# 将XML反序列化为具有C中对象列表的对象#

C# 将XML反序列化为具有C中对象列表的对象#,c#,xml,xmlserializer,xml-deserialization,C#,Xml,Xmlserializer,Xml Deserialization,我有以下要反序列化为对象的xml <result> <reporttype>2</reporttype> <items> <item> <sku>0B0005</sku> <style>0B0005.DAK.GREY</style> <reason>Barcode canno

我有以下要反序列化为对象的xml

<result>
    <reporttype>2</reporttype>
    <items>
        <item>
            <sku>0B0005</sku>
            <style>0B0005.DAK.GREY</style>
            <reason>Barcode cannot be moved to different SKUs</reason>
        </item>
        <item>
            <sku>0B0006</sku>
            <style>0B0006.DAK.GREY</style>
            <reason>Barcode cannot be moved to different SKUs</reason>
        </item>
    </items>
</result>

2.
0B0005
0B0005.DAK.GREY
无法将条形码移动到不同的SKU
0B0006
0B0006.DAK.GREY
无法将条形码移动到不同的SKU
但是下面的代码没有填充项目列表,有人能指出我在这里做错了什么吗

string inputString = @"<result><reporttype>2</reporttype><items><item><sku>0B0005</sku><style>0B0005.DAK.GREY</style><reason>Barcode cannot be moved to different SKUs</reason></item><item><sku>0B0005</sku><style>0B0005.DAK.GREY</style><reason>Barcode cannot be moved to different SKUs</reason></item></items></result>";

XmlDocument doc = new XmlDocument();
doc.LoadXml(inputString);

XmlSerializer serializer = new XmlSerializer(typeof(Result));
StringReader rdr = new StringReader(doc.InnerXml);
Result resultingMessage = (Result)serializer.Deserialize(rdr);

public enum ReportType {
    [XmlEnum("0")]
    InternalErrorReport,
    [XmlEnum("1")]
    ErrorReport,
    [XmlEnum("2")]
    InternalSuccessReport
}

[XmlRoot(ElementName = "result")]
public class Result {
    [XmlElement(ElementName = "reporttype")]
    public ReportType reportType { get; set; }
    [XmlElement(ElementName = "items")]
    public List<Item> items = new List<Item>();

    public string error { get; set; }

    public class Item {
        [XmlElement(ElementName = "sku")]
        string sku { get; set; }
        [XmlElement(ElementName = "style")]
        string style { get; set; }
        [XmlElement(ElementName = "reason")]
        string reason { get; set; }
    }
}
string inputString=@“20B00050B0005.DAK.GREYBarcode不能移动到不同的SKU 0B00050B0005.DAK.GREYBarcode不能移动到不同的SKU”;
XmlDocument doc=新的XmlDocument();
doc.LoadXml(inputString);
XmlSerializer serializer=新的XmlSerializer(typeof(Result));
StringReader rdr=新的StringReader(doc.InnerXml);
结果结果消息=(结果)序列化程序。反序列化(rdr);
公共枚举报告类型{
[XmlEnum(“0”)]
内部错误报告,
[XmlEnum(“1”)]
错误报告,
[XmlEnum(“2”)]
内部成功报告
}
[XmlRoot(ElementName=“result”)]
公开课成绩{
[XmlElement(ElementName=“reporttype”)]
公共报告类型报告类型{get;set;}
[xmlement(ElementName=“items”)]
公共列表项=新列表();
公共字符串错误{get;set;}
公共类项目{
[XmlElement(ElementName=“sku”)]
字符串sku{get;set;}
[xmlement(ElementName=“style”)]
字符串样式{get;set;}
[XmlElement(ElementName=“原因”)]
字符串原因{get;set;}
}
}

或者有更好的方法吗?

项应该是Xmlroot元素,并且它包含XmlElement项,您必须告诉它何时反序列化到对象。试试这个:

public class Item
{
    [XmlElement(ElementName = "sku")]
    public string Sku { get; set; }
    [XmlElement(ElementName = "style")]
    public string Style { get; set; }
    [XmlElement(ElementName = "reason")]
    public string Reason { get; set; }
}

[XmlRoot(ElementName = "items")]
public class Items
{
    [XmlElement(ElementName = "item")]
    public List<Item> Item { get; set; }
}

[XmlRoot(ElementName = "result")]
public class Result
{
    [XmlElement(ElementName = "reporttype")]
    public string Reporttype { get; set; }
    [XmlElement(ElementName = "items")]
    public Items Items { get; set; }
}
公共类项目
{
[XmlElement(ElementName=“sku”)]
公共字符串Sku{get;set;}
[xmlement(ElementName=“style”)]
公共字符串样式{get;set;}
[XmlElement(ElementName=“原因”)]
公共字符串原因{get;set;}
}
[XmlRoot(ElementName=“items”)]
公共类项目
{
[xmlement(ElementName=“item”)]
公共列表项{get;set;}
}
[XmlRoot(ElementName=“result”)]
公开课成绩
{
[XmlElement(ElementName=“reporttype”)]
公共字符串报告类型{get;set;}
[xmlement(ElementName=“items”)]
公共项目{get;set;}
}

项应该是Xmlroot元素,并且它包含XmlElement项,您必须告诉它何时反序列化到对象。试试这个:

public class Item
{
    [XmlElement(ElementName = "sku")]
    public string Sku { get; set; }
    [XmlElement(ElementName = "style")]
    public string Style { get; set; }
    [XmlElement(ElementName = "reason")]
    public string Reason { get; set; }
}

[XmlRoot(ElementName = "items")]
public class Items
{
    [XmlElement(ElementName = "item")]
    public List<Item> Item { get; set; }
}

[XmlRoot(ElementName = "result")]
public class Result
{
    [XmlElement(ElementName = "reporttype")]
    public string Reporttype { get; set; }
    [XmlElement(ElementName = "items")]
    public Items Items { get; set; }
}
公共类项目
{
[XmlElement(ElementName=“sku”)]
公共字符串Sku{get;set;}
[xmlement(ElementName=“style”)]
公共字符串样式{get;set;}
[XmlElement(ElementName=“原因”)]
公共字符串原因{get;set;}
}
[XmlRoot(ElementName=“items”)]
公共类项目
{
[xmlement(ElementName=“item”)]
公共列表项{get;set;}
}
[XmlRoot(ElementName=“result”)]
公开课成绩
{
[XmlElement(ElementName=“reporttype”)]
公共字符串报告类型{get;set;}
[xmlement(ElementName=“items”)]
公共项目{get;set;}
}

您可以为
项添加两个属性
属性-以满足序列化要求

[XmlRoot(ElementName = "result")]
public class Result 
{
    [XmlArray("items")]
    [XmlArrayItem("item")]
    public List<Item> items = new List<Item>();
}

当然,公开属性

您可以为
属性添加两个属性,以满足序列化要求

[XmlRoot(ElementName = "result")]
public class Result 
{
    [XmlArray("items")]
    [XmlArrayItem("item")]
    public List<Item> items = new List<Item>();
}

当然,将属性公开

变量需要公开

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)
        {
            string xml = File.ReadAllText(FILENAME);

            XmlSerializer serializer = new XmlSerializer(typeof(Result));
            StringReader rdr = new StringReader(xml);
            Result resultingMessage = (Result)serializer.Deserialize(rdr);


        }
    }
    public enum ReportType
    {
        [XmlEnum("0")]
        InternalErrorReport,
        [XmlEnum("1")]
        ErrorReport,
        [XmlEnum("2")]
        InternalSuccessReport
    }

    [XmlRoot(ElementName = "result")]
    public class Result
    {
        [XmlElement(ElementName = "reporttype")]
        public ReportType reportType { get; set; }
        public Items items { get; set; }
        public string error { get; set; }


    }
    [XmlRoot("items")]
    public class Items
    {
        [XmlElement(ElementName = "item")]
        public List<Item> items = new List<Item>();
    }
    [XmlRoot("item")]
    public class Item
    {
        [XmlElement(ElementName = "sku")]
        public string sku { get; set; }
        [XmlElement(ElementName = "style")]
        public string style { get; set; }
        [XmlElement(ElementName = "reason")]
        public string reason { get; set; }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Serialization;
使用System.IO;
命名空间控制台应用程序1
{
班级计划
{
常量字符串文件名=@“c:\temp\test.xml”;
静态void Main(字符串[]参数)
{
字符串xml=File.ReadAllText(文件名);
XmlSerializer serializer=新的XmlSerializer(typeof(Result));
StringReader rdr=新的StringReader(xml);
结果结果消息=(结果)序列化程序。反序列化(rdr);
}
}
公共枚举报告类型
{
[XmlEnum(“0”)]
内部错误报告,
[XmlEnum(“1”)]
错误报告,
[XmlEnum(“2”)]
内部成功报告
}
[XmlRoot(ElementName=“result”)]
公开课成绩
{
[XmlElement(ElementName=“reporttype”)]
公共报告类型报告类型{get;set;}
公共项目{get;set;}
公共字符串错误{get;set;}
}
[XmlRoot(“项目”)]
公共类项目
{
[xmlement(ElementName=“item”)]
公共列表项=新列表();
}
[XmlRoot(“项目”)]
公共类项目
{
[XmlElement(ElementName=“sku”)]
公共字符串sku{get;set;}
[xmlement(ElementName=“style”)]
公共字符串样式{get;set;}
[XmlElement(ElementName=“原因”)]
公共字符串原因{get;set;}
}
}

变量必须是公共的

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)
        {
            string xml = File.ReadAllText(FILENAME);

            XmlSerializer serializer = new XmlSerializer(typeof(Result));
            StringReader rdr = new StringReader(xml);
            Result resultingMessage = (Result)serializer.Deserialize(rdr);


        }
    }
    public enum ReportType
    {
        [XmlEnum("0")]
        InternalErrorReport,
        [XmlEnum("1")]
        ErrorReport,
        [XmlEnum("2")]
        InternalSuccessReport
    }

    [XmlRoot(ElementName = "result")]
    public class Result
    {
        [XmlElement(ElementName = "reporttype")]
        public ReportType reportType { get; set; }
        public Items items { get; set; }
        public string error { get; set; }


    }
    [XmlRoot("items")]
    public class Items
    {
        [XmlElement(ElementName = "item")]
        public List<Item> items = new List<Item>();
    }
    [XmlRoot("item")]
    public class Item
    {
        [XmlElement(ElementName = "sku")]
        public string sku { get; set; }
        [XmlElement(ElementName = "style")]
        public string style { get; set; }
        [XmlElement(ElementName = "reason")]
        public string reason { get; set; }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Serialization;
使用System.IO;
命名空间控制台应用程序1
{
班级计划
{
常量字符串文件名=@“c:\temp\test.xml”;
静态void Main(字符串[]参数)
{
字符串xml=File.ReadAllText(文件名);
XmlSerializer serializer=新的XmlSerializer(typeof(Result));
StringReader rdr=新的StringReader(xml);
结果结果消息=(结果)序列化程序。反序列化(rdr);
}
}
公共枚举报告类型
{
[XmlEnum(“0”)]
内部错误报告,
[XmlEnum(“1”)]
错误报告,
[XmlEnum(“2”)]
内部成功报告
}
[XmlRoot(ElementName=“result”)]
公开课成绩
{
[XmlElement(ElementName=“reporttype”)]
公共报告类型报告类型{get;set;}
公共项目{get;set;}