在 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文件的可行方法的想法吗?

谢谢阿尔伯特

在 C# 中处理多版本 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() 
    }
}