C# 用C语言处理多版本XML文件的方法#
我需要一些帮助来设计一个适当的解决方案来处理各种版本的XML文件 编程语言:C# 平台:Windows(WPF) 目前,我处理一组具有相同结构的XML文件。XML文件中有一个架构版本号。为了给你一个想法,考虑下面的例子: (请注意,以下仅为伪数据,可能包含一些打字错误) 第1版:C# 用C语言处理多版本XML文件的方法#,c#,xml,wpf,serialization,xsd,C#,Xml,Wpf,Serialization,Xsd,我需要一些帮助来设计一个适当的解决方案来处理各种版本的XML文件 编程语言:C# 平台:Windows(WPF) 目前,我处理一组具有相同结构的XML文件。XML文件中有一个架构版本号。为了给你一个想法,考虑下面的例子: (请注意,以下仅为伪数据,可能包含一些打字错误) 第1版: <?xml version="1.0" encoding="utf-8"?> <sml Version="1.0.5" ....> <Car> <Informati
<?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>
对于数据表示部分,我创建了另一个使用可用数据子集的类:
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
Presentation类的字段是从(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>
这很清楚,因为在新模式中,传输不再是类引擎的一部分
由于当时我可以构建应用程序的新版本并包含新的类,因此我或多或少可以自由选择处理新XML模式的方式。
当时我仍然需要的是能够读取“旧”XML数据文件(以及具有新模式的XML文件)
我可以编写新的方法来处理各种XML版本(将来模式会有一些更改),但我不想为每个XML版本的表示层重复代码(因为在更改代码时,有几十行代码会成为管理上的噩梦)。
我知道有一些商业工具可以处理XSD模式更改,将它们组合成一个类并生成类,但在这个项目中,花钱购买许可证是不可取的
有谁能分享一些关于处理类似XML文件的可行方法的想法
多谢各位,
Albert解决这类问题的一个常见方法是为每个新版本的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()
}
}
您可能需要一个映射层来更新旧的格式,例如应用XSLT来调整格式,以便可以对其进行反序列化?您需要将XML的消化与使用分开。您的表示层需要不再关心使用什么XML来填充它。如果项目只是添加或删除,您应该能够使用相同的类,但是由于您正在更改节点内的位置,您需要根据版本来实现和读取它。@dbugger Hi,谢谢您的回答。对不起,我没提那件事。我已经在表示层下面有一个层来处理数据读取。但正是在这一层中,我需要一种从不同格式的XML文件中赋值的方法。我会尝试一下,然后回去报告调查结果。比尔,阿尔伯特
carInfo.Transmission=smlCarInformationEngine.Transmission; results in an error
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()
}
}