C#反序列化只有一项的嵌套元素

C#反序列化只有一项的嵌套元素,c#,xml,nested,xml-serialization,deserialization,C#,Xml,Nested,Xml Serialization,Deserialization,我使用C#对XML文件进行反序列化。我的XML文件的格式为: 当反序列化时我想删除中间人生产单元。因为生成单位始终只包含一个子元素生成指定单位的单位。 我对如何实施的最初想法不起作用: 公共类单元 { 公共字符串名称{get;set;} 公共字符串ID{get;set;} } 公共课由 { [XmlElement(“生产单元”)] [XmlElement(“单位”)] 公共单位单位{get;set;} } 可以使用[XmlArray(“生产单位”)、XmlArrayItem(“单位”)]

我使用C#对XML文件进行反序列化。我的XML文件的格式为:


反序列化时我想删除中间人生产单元。因为生成单位始终只包含一个子元素生成指定单位的单位。 我对如何实施的最初想法不起作用:

公共类单元
{
公共字符串名称{get;set;}
公共字符串ID{get;set;}
}
公共课由
{
[XmlElement(“生产单元”)]
[XmlElement(“单位”)]
公共单位单位{get;set;}
}
可以使用[XmlArray(“生产单位”)、XmlArrayItem(“单位”)]
然后通过contain:public List{get;set;}生成了_。但这不是我想要的。

据我所知,不可能使用带有“producting_Unit”标记的XML,而是放弃带有标准属性的匹配的
producting_Unit
类,如果不实现标准属性,最好的办法就是将应用程序/业务逻辑与序列化层分离

使序列化数据模型保持简单并与XML模式匹配(这意味着包括包装
生成单元
类),然后简单地转换到该数据模型和更干净的数据模型(无
生成单元
),以便应用程序的其余部分使用


编辑:下面是一个使用
IXmlSerializable
接口的实现。我只是很快就把它去掉了,老实说,不知道它是否适用于所有情况

public class Unit
{
    public string Name { get; set; }

    public string ID { get; set; }
}

public class Produced_by : IXmlSerializable
{
    public Unit Unit { get; set; }

    public void WriteXml (XmlWriter writer)
    {
        writer.WriteStartElement("Produced_by");
        writer.WriteStartElement("Producing_Unit");
        writer.WriteStartElement("Unit");
        writer.WriteAttributeString("ID", this.Unit.ID);
        writer.WriteAttributeString("Name", this.Unit.Name);
        writer.WriteEndElement();
        writer.WriteEndElement();
        writer.WriteEndElement();
    }

    public void ReadXml (XmlReader reader)
    {
        while (reader.Read())
        {
            if (reader.Name == "Unit")
            {
                this.Unit = new Unit()
                {
                    Name = reader.GetAttribute("Name"),
                    ID = reader.GetAttribute("ID")
                };

                break;
            }
        }
    }

    public XmlSchema GetSchema()
    {
        return(null);
    }
}
我怀疑我的阅读方式不好,但这在我的本地测试中有效。但我仍然建议将应用程序和序列化问题分开,避免编写这样的实现。

您可以尝试以下方法:

public class Unit
{
    public string Name { get; set; }
    public string ID { get; set; }
}

public class Producing_Unit
{
    public Unit Unit { get; set; }
}

public class Produced_by
{
    private Producing_Unit producing_unit;

    public Producing_Unit Producing_Unit //This can't be auto-implemented since can write to properties of properties.
    { 
        get { return producing_Unit; } 
        set { producing_Unit = value; }
    }

    [XmlIgnoreAttribute]
    public Unit Unit
    {
        get { return producing_Unit.Unit; }
        set { producing_Unit.Unit = value; }
    }
}

是的,它不能摆脱“中间人”,但你可以忽略他们。

尝试将XMLElement属性放在Unit类中,并放在其属性之上。好了,XML不可能与“生产单元”一起使用标记,但不要使用标准属性创建匹配的
单元
类,最好的办法是将应用程序/业务逻辑与序列化层分离。保持序列化的简单性并与XML模式相匹配,然后简单地转换该数据模型和一个更干净的数据模型(无需
生成单位
),以便应用程序的其余部分使用。@Ramie你能给我举个例子吗?我有一个XML文件要反序列化,而不是反序列化。@bjar bjar:ah,因此,您发布的第一个XML示例(带有包装的“生产单位”标记)是您想要使用的固定XML,但您不想要求第三个中间人
生产单位
类?这正是我的问题。@bjar bjar:我编辑了我的答案。抱歉,我认为使用内置的XML序列化属性无法实现这一点。@bjar bjar:我再次编辑了我的答案;我已经包括了
IXmlSerializable
的一个工作实现。我仍然不推荐使用它,但在我的本地测试中,它运行良好。