在 C# 中处理多版本 XML 文件的方法
本文关键字:XML 文件 方法 版本 处理 | 更新日期: 2023-09-27 18:35:10
我需要一些帮助来设计一个合适的解决方案来处理各种版本的XML文件。
编程语言:C#
平台: 视窗 (WPF)
目前,我处理一堆具有相同结构的XML文件。XML 文件中有一个架构版本号。为了给您一个想法,请考虑以下示例:(请注意,以下仅为伪数据,可能包含一些拼写错误)
版本1:
<?xml version="1.0" encoding="utf-8"?>
<sml Version="1.0.5" ....>
<Car>
<Information>
<Engine>
<Type>Diesel</Type>
<Transmission>5-speed</Transmission>
</Engine>
<Color>blue</Color>
</Information>
</Car>
</sml>
为了处理XML数据,我通过Visual Studio XSD工具创建了一个XML模式,并生成了一个相应的类,如下所示(剥离):
public partial class sml {
private smlCarInformation[][] carField;
private string versionField;
public smlCarInformation[][] Car {
get {
return this.carField;
}
set {
this.carField = value;
}
}
public string Version {
get {
return this.versionField;
}
set {
this.versionField = value;
}
}
}
public partial class smlCarInformationEngine {
private string typeField;
private string transmissionField;
public string Type {
get {
return this.typeField;
}
set {
this.typeField = value;
}
}
public string Transmission {
get {
return this.transmissionField;
}
set {
this.transmissionField = value;
}
}
} .....
对于数据表示部分,我创建了另一个使用可用数据子集的类:
public class DisplayCarInformation {
public string Model;
public string Type;
public int HorsePower;
public string Transmission;
}
读取 XML 数据后,处理工作正常,如下所示:
DisplayCarInformation carInfo=new DisplayCarInformation();
carInfo.Model="Ford";
carInfo.Type=smlCarInformationEngine.Type;
carInfo.Transmission=smlCarInformationEngine.Transmission;
基本上处理数据可以看作是:
carInfo.Type=smlCarInformationEngine.Type;
表示法类的字段是从 (XSD) 生成的类的字段中分配的值
目前为止,一切都好。数据可以成功处理,每个人都很高兴。
但是,一段时间后,XML 数据文件发生了更改:
<?xml version="1.0" encoding="utf-8"?>
<sml Version="1.0.6" ....>
<Car>
<Information>
<Engine>
<Type>Diesel</Type>
<Capacity>1980</Capacity>
</Engine>
<Color>blue</Color>
<Transmission>5-speed</Transmission>
</Information>
</Car>
</sml>
这正是问题开始出现的地方。通常,架构几乎相同 - 但是可能会更改,添加,删除,移动一些字段。如上例所示,"传输"已移动并添加了"容量"。
以前生成的 XSD 架构不会反映这一点,创建一个与旧架构几乎相同的新架构并将其与其生成的类添加到 Visual Studio 项目中会导致声明类的歧义(这很明显,因为几乎所有属性都是相同的)。删除旧架构及其类并将其替换为新架构会导致错误,例如
carInfo.Transmission=smlCarInformationEngine.Transmission; results in an error
这很清楚,因为传输不再是新模式中类引擎的一部分。
由于我可以在那时构建应用程序的新版本并包含新类,因此我或多或少可以自由选择哪种方式来处理新的 XML 架构。那时我仍然需要的是能够读取"旧"XML 数据文件(以及具有新架构的 XML 文件)。
我可以编写新的方法来处理各种XML版本(将来会对架构进行一些更改),但是我不想为每个XML版本重复表示层的代码(因为有几十行代码,在更改代码时成为管理噩梦)。我知道有一些商业工具可以处理XSD模式更改,将它们组合成一个并生成类,但是在这个项目中,花钱在许可证上不是一个选择。
有人可以分享一些关于处理类似XML文件的可行方法的想法吗?
谢谢阿尔伯特
此类问题的常见解决方案是为每个新版本的 XML 创建一个接口和该接口的具体实现。在此确切情况下可能更合适的替代方法是将 abstract
基类与派生类可以调用的一些abstract
方法和一些受保护的方法一起使用。在这种情况下,可以将公共代码放入基类中,并从派生类调用它。下面是一个简单的示例:
public abstract class BaseConversion
{
public abstract string VersionNumber { get; set; }
public abstract string MethodToBeImplementedInEachDerivedClass();
protected void MethodImplementedHereToBeUsedByDerivedClasses()
{
// Implement common code here
}
}
public class Schema147Conversion : BaseConversion
{
public override string VersionNumber { get { return "147"; } }
public override string MethodToBeImplementedInEachDerivedClass()
{
return ""; // Implement schema specific code here...
// can use MethodImplementedHereToBeUsedByDerivedClasses()
}
}