2017-02-16 66 views
0

我已经为用户设置添加了一个为config.xml文件添加的应用程序。C# - 从XML创建的数据集中读取数据的干净方式

我通过简单地阅读它:

DataSet config = new DataSet(); 
config.ReadXml(configPath); 

参数config.xml中在一些表下分组列:

<?xml version="1.0" standalone="yes"?> 
<UserSetup> 
    <TableA> 
    <revBegin>value1</revBegin> 
    <revEnd>value2</revEnd> 
    ... 
    </TableA> 
    ... 
</UserSetup> 

我正在寻找的是读一个干净的方式从DataSet配置中,不需要记忆表或列的名称。

在我目前的执行我实现了由下面的类:

public static class MyTables 
{ 
    public static class TableA 
    { 
     public const String name = "TableA"; 
     public const String revBegin = "revBegin"; 
     public const String revEnd = "revEnd"; 
     ... 
    } 
    ... 
} 

和我读到这样的价值观:

String revEnd = config.Tables[MyTables.TableA.name].Rows[0][MyTables.TableA.revEnd].ToString(); 

但我不知怎么填,这是相当复杂的解决很简单的问题 - 不要说讨厌的方式。

你有什么想法,我怎么能让事情变得更简单或更清洁?

P.S.在某些时候,我尝试将config.Tables[MyTables.TableA.name]部分减少到config.Tables[MyTables.TableA],但是 - 我怎么看它 - 它需要将Index[object]添加到密封类DataTableCollection并在我的静态类中覆盖ToString()方法 - 两者都不可能。我对吗?

+0

我通常创建一个示例DataSet,然后使用config.WriteXml(“filename”,XmlWriteMode.WriteSchema)保存;标准DataSet的根标签为DataSet名称,下一级标签为表名,第三级标签为列名后跟行数据。 – jdweng

回答

1

除非您绝对必须使用DataSet来读取XML,否则您可以使用XML序列化实现相同的结果。用下面的注释来说明你的课程。

 [XmlRoot] 
     [Serializable] 
     public class UserSetUp 
     { 
      [XmlElement] 
      public TableA TableA { get; set; } 
     } 

     [Serializable] 
     public class TableA 
     { 
      [XmlElement] 
      public string revBegin { get; set; } 

      [XmlElement] 
      public string revEnd { get; set; } 
     } 

假设你的配置在C:\这个例子中。

var configStream = File.OpenRead(@"C:\Config.xml"); 
    var reader = new StreamReader(configStream); 
    var xmlString = reader.ReadToEnd(); 
    var serializer = new XmlSerializer(typeof(UserSetUp)); 
    var stringReader = new StringReader(xmlString); 

    var userSetup = (UserSetUp)serializer.Deserialize(stringReader); 

我用下面的XML测试过它,它工作正常。

<?xml version="1.0" encoding="utf-16" ?> 
<UserSetUp> 
    <TableA> 
    <revBegin>1</revBegin> 
    <revEnd>2</revEnd> 
    </TableA> 
</UserSetUp> 

希望能帮助你。

+0

我不得不专注于别的事情,而且我没有时间更早地检查您的解决方案,但这正是我所需要的。事实上,还有一种想法需要用这种方法解决:有一个部分,用户可以添加尽可能多的列,因为他/她想要对其进行foreach,但这是单独的问题。万分感谢。 – Piotrek