C#反序列化只有一项的嵌套元素
我使用C#对XML文件进行反序列化。我的XML文件的格式为: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(“单位”)]
当反序列化时我想删除中间人生产单元。因为生成单位始终只包含一个子元素生成指定单位的单位。
我对如何实施的最初想法不起作用:
公共类单元
{
公共字符串名称{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
的一个工作实现。我仍然不推荐使用它,但在我的本地测试中,它运行良好。