C# 寻找使用XML文件作为常量数据源的可行解决方案

C# 寻找使用XML文件作为常量数据源的可行解决方案,c#,xml,C#,Xml,我正在寻找如何最好地解决我的问题的建议 我有一个web应用程序,它将利用数据库和XML文件作为数据源 更新数据库没有问题,处理XML文件没有问题 首先,要理解web应用是当前(以及表现不佳的生产系统)的一个旁路。因此没有灵活性 因此,对于XML文件,如果用户添加/更新/删除字段,则需要执行以下步骤。 从linux服务器中提取XML文件 将XML文件解析为UI的POCO 通过修改从POCOs重新创建XML文件 将XML文件推送到linux服务器 唯一对我有利的是,在给定的时间内,我不会有太多用户使

我正在寻找如何最好地解决我的问题的建议

我有一个web应用程序,它将利用数据库和XML文件作为数据源

更新数据库没有问题,处理XML文件没有问题

首先,要理解web应用是当前(以及表现不佳的生产系统)的一个旁路。因此没有灵活性

因此,对于XML文件,如果用户添加/更新/删除字段,则需要执行以下步骤。
  • 从linux服务器中提取XML文件
  • 将XML文件解析为UI的POCO
  • 通过修改从POCOs重新创建XML文件
  • 将XML文件推送到linux服务器


    唯一对我有利的是,在给定的时间内,我不会有太多用户使用此应用程序。

    我强烈建议查看
    DataContractSerializer
    ,以满足您的序列化需求。对象必须遵循与XML相同的格式,但没有理由不能将这些对象作为模型。下面是一个标记POCO以自动与XML进行序列化的示例:

    [DataContract]
    public class Account
    {
        [DataMember, XmlAttribute]
        public string Name { get; set; }
    
        [DataMember]
        public double Balance { get; set; }
    }
    
    然后使用如下序列化代码:

    string serializedAccount = null;
    
    XmlSerializer serializer = new XmlSerializer(typeof(Account));
    using(StringWriter writer = new StringWriter())
    {
        serializer.Serialize(writer, myAccountObject);
        serializedAccount = writer.ToString();
    }
    
    // serializedAccount should look something like this:
    //
    // <Account Name="MyName">
    //   <Balance>100</Balance>
    // </Account>
    //
    // Each of the DataMember and DataContract attributes allow you to override
    // names so that you can make them lower case, or provide a more meaningful
    // name in your POCO.
    
    Account deserializedAccount = null;
    using(StringReader reader = new StringReader(serializedAccount))
    {
        deserializedAccount = serializer.DeSerialize(reader) as Account;
    }
    
    字符串序列化daccount=null;
    XmlSerializer serializer=新的XmlSerializer(typeof(Account));
    使用(StringWriter=新StringWriter())
    {
    serializer.Serialize(writer,myAccountObject);
    serializedAccount=writer.ToString();
    }
    //序列化计数应如下所示:
    //
    // 
    //   100
    // 
    //
    //每个DataMember和DataContract属性都允许您覆盖
    //名称,以便将其小写,或提供更有意义的
    //在您的POCO中输入您的姓名。
    帐户反序列化daccount=null;
    使用(StringReader=新StringReader(serializedAccount))
    {
    deserializedAccount=序列化程序。将(读取器)反序列化为帐户;
    }
    
    要记住以下几点:

    • DataContract是一种选择加入策略。除非明确将成员标记为已忽略,否则将忽略成员
    • 如果要显式将字段或属性标记为已忽略,请使用
      [IgnoreDataMember]
      属性。即使只是出于文档目的,它也很方便
    • 序列化程序中没有任何内容阻止您实现
      INotifyPropertyChanged
      ,因此您的所有属性都可以绑定(对于WPF很方便)
    • 如果XML格式不是要用作UI模型的格式,则可能仍需要将一个对象中的属性映射到另一个对象中的属性。这仍然比自己手工编写XML读/写代码要容易几个数量级

    注意:如果您的服务器实现了正确的soapwebapi,那么WCF可以获取WSDL并生成到API和需要序列化的对象的绑定。如果是REST API,则需要做更多的工作,但也支持REST API。

    听起来不错,开始编码吧。您的xml文件是否在POCO中有可以直接从xml文件序列化和反序列化的表示形式?我假设POCO对象是二进制的,xml只是数据的包装。所以二进制可能是UU编码的。因此,首先必须使用UUDecode来获取二进制文件。一旦你有二进制,最好在C++代码之前使用C++实用程序把二进制文件打包成对象。