Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用C语言处理多版本XML文件的方法#_C#_Xml_Wpf_Serialization_Xsd - Fatal编程技术网

C# 用C语言处理多版本XML文件的方法#

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文件

编程语言:C#

平台:Windows(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>
对于数据表示部分,我创建了另一个使用可用数据子集的类:

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() 
    }
}