C#仅使用一个项目反序列化嵌套元素

时间:2014-05-08 20:06:40

标签: c# xml nested xml-serialization deserialization

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

<Produced_by >
    <Producing_Unit>
        <Unit ID="" Name=""/>
    </Producing_Unit>
</Produced_by>

反序列化 时,我想删除中间人Producing_Unit。由于Produced_by将始终只包含一个指定Unit的子元素Producing_Unit。 我对如何实施的初步想法并不奏效:

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

public class Produced_by
{
    [XmlElement("Producing_Unit")]
    [XmlElement("Unit")]
    public Unit Unit { get; set; }
}

可以通过使用[XmlArray(&#34; Producing_Unit&#34;),XmlArrayItem(&#34; Unit&#34;)]来完成它。 然后让Produced_by包含:public List&lt; Unit&gt; {获得;设置;}。但那不是我想要的。

2 个答案:

答案 0 :(得分:0)

据我所知,不可能将XML与“Producing_Unit”标记一起使用,但抛弃匹配的Producing_Unit类,其标准属性不能实现IXmlSerializable interface.。最好的选择是将应用程序/业务逻辑与序列化层分开。

保持序列化数据模型简单并与XML模式匹配(这意味着包括包装Producing_Unit类),然后简单地转换为/从该数据模型和更清晰的数据模型(没有Producing_Unit)用于您的其他应用程序。


编辑:这是使用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);
    }
}

我怀疑我是以糟糕的方式进行阅读,但这在我的本地测试中起作用。我仍然建议将应用程序和序列化问题分开,避免编写这样的实现。

答案 1 :(得分:0)

你可以试试这个:

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

是的,它并没有摆脱中间人,&#39;但你可以忽略它们。