【问题标题】:XML Deserialization to C# weird XML and weirder class generatedXML反序列化为C#怪异的XML和生成的怪异类
【发布时间】:2016-06-15 17:13:30
【问题描述】:

我已经阅读了多个线程,并且能够利用 C# 中的序列化方法反序列化 XML。我遇到的问题是我提供的 XML 不像我以前见过的那样。而不是拥有一个包含项目列表的对象,我得到一个包含多个属性的项目的对象。这就是我所拥有的。这是 XML:

<DATA>
    <OBJECT TYPE="Sheet consumption">
        <ITEM>
            <PROPERTY NAME="Sheet">GN18 48x120</PROPERTY>
            <PROPERTY NAME="Sheet used area">31.556835306782627</PROPERTY>
            <PROPERTY NAME="Made quantity">2</PROPERTY>
            <PROPERTY NAME="Required quantity">2</PROPERTY>
            <PROPERTY NAME="Sheet weight">34.132561</PROPERTY>
            <PROPERTY NAME="Sheet width">1219.2</PROPERTY>
            <PROPERTY NAME="Sheet length">3048</PROPERTY>
            <PROPERTY NAME="Sheet thickness">1.1684</PROPERTY>
            <PROPERTY NAME="Real time">0.712</PROPERTY>
            <PROPERTY NAME="Production order">139020</PROPERTY>
            <PROPERTY NAME="Item">W220-09528</PROPERTY>
            <PROPERTY NAME="Quantity/Sheet">55</PROPERTY>
        </ITEM>
        <ITEM>
            <PROPERTY NAME="Sheet">GN20 48x120</PROPERTY>
            <PROPERTY NAME="Sheet used area">35.895446716901191</PROPERTY>
            <PROPERTY NAME="Made quantity">14</PROPERTY>
            <PROPERTY NAME="Required quantity">14</PROPERTY>
            <PROPERTY NAME="Sheet weight">26.618381</PROPERTY>
            <PROPERTY NAME="Sheet width">1219.2</PROPERTY>
            <PROPERTY NAME="Sheet length">3048</PROPERTY>
            <PROPERTY NAME="Sheet thickness">0.9144</PROPERTY>
            <PROPERTY NAME="Real time">0.414</PROPERTY>
            <PROPERTY NAME="Production order">139019</PROPERTY>
            <PROPERTY NAME="Item">W220-09533-C</PROPERTY>
            <PROPERTY NAME="Quantity/Sheet">7</PROPERTY>
        </ITEM>
    </OBJECT>
</DATA>

这就是类反序列化的样子

使用 System.Collections.Generic; 使用 System.Xml.Serialization;

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

namespace WindowsFormsApplication1
{
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440")]
    [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 DATA
    {

        private DATAOBJECT itemsField;

        /// <remarks/>
        [System.Xml.Serialization.XmlElement("OBJECT")]
        public DATAOBJECT Items
        {
            get
            {
                return this.itemsField;
            }
            set
            {
                this.itemsField = value;
            }
        }
    }

    /// <remarks/>

    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]

    public partial class DATAOBJECT
    {

        private List<DATAOBJECTITEMPROPERTY> iTEMField;

        private string tYPEField;

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
        [System.Xml.Serialization.XmlArrayItem("PROPERTY", typeof(DATAOBJECTITEMPROPERTY), Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
        public List<DATAOBJECTITEMPROPERTY> ITEM
        {
            get
            {
                return this.iTEMField;
            }
            set
            {
                this.iTEMField = value;
            }
        }

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

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

        private string nAMEField;

        private string valueField;

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

        /// <remarks/>
        [System.Xml.Serialization.XmlTextAttribute()]
        public string Value
        {
            get
            {
                return this.valueField;
            }
            set
            {
                this.valueField = value;
            }
        }
    }
}

当我反序列化时,我期望的结果是有 2 个 DATAOBJECTITEMPROPERTY 类型的对象,但我得到了 24 个 DATAOBJECTITEMPROPERTY 类型的对象,其中基本上是每个属性名称。

我不明白我做错了什么。

【问题讨论】:

    标签: c# xml deserialization xml-deserialization


    【解决方案1】:

    您没有做错任何事情,您使用该工具在复杂的事情上生成类并省略了一个级别。我使用像http://xmltocsharp.azurewebsites.net/ 这样的在线生成器为我生成分类。

    它为您的示例生成了更清晰、更易于理解的类。

    [XmlRoot(ElementName = "PROPERTY")]
    public class PROPERTY
    {
        [XmlAttribute(AttributeName = "NAME")]
        public string NAME { get; set; }
        [XmlText]
        public string Text { get; set; }
    }
    
    [XmlRoot(ElementName = "ITEM")]
    public class ITEM
    {
        [XmlElement(ElementName = "PROPERTY")]
        public List<PROPERTY> PROPERTY { get; set; }
    }
    
    [XmlRoot(ElementName = "OBJECT")]
    public class OBJECT
    {
        [XmlElement(ElementName = "ITEM")]
        public List<ITEM> ITEM { get; set; }
        [XmlAttribute(AttributeName = "TYPE")]
        public string TYPE { get; set; }
    }
    
    [XmlRoot(ElementName = "DATA")]
    public class DATA
    {
        [XmlElement(ElementName = "OBJECT")]
        public List<OBJECT> OBJECT { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 2014-04-25
      • 1970-01-01
      • 2013-02-07
      • 2012-04-25
      • 1970-01-01
      • 2012-03-04
      相关资源
      最近更新 更多