我使用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; {获得;设置;}。但那不是我想要的。
答案 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;但你可以忽略它们。