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

时间:2016-03-24 12:18:00

标签: c# xml

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

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

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

首先要了解网络应用程序是当前(和糟糕的生产系统)的旁路。所以那里没有灵活性。

因此,在XML文件的情况下,如果用户添加/更新/删除字段,则需要执行以下步骤。

  • 从linux服务器中提取XML文件
  • 将XML文件解析为UI的POCO
  • 通过修改从POCO重新创建XML文件
  • 将XML文件推送到linux服务器

    对我有利的唯一好处是我在一定时间内没有多少用户使用此应用。

  • 1 个答案:

    答案 0 :(得分:0)

    我强烈建议您查看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;
    }
    

    要记住几件事:

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

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