2017-05-23 5 views
0

XMLファイルから読み込んでいる値があります。これらは、そのようなプログラムの先頭で宣言されます。XML値から適切な変数を取得する

static public int NumRecords; 
static public int DBSize; 
static public string SourceWorkbookPath; 
static public string SourceSheetName; 
static public string DestWorkbookPath; 
static public string DestSheetName; 

そして、私が実行してその値に読んでいる:

private static void LoadXMLParameters() 
    { 
     XmlTextReader reader = new XmlTextReader(ParameterFilePath); 

     while (reader.Read()) 
     { 
      switch (reader.NodeType) 
      { 
       case XmlNodeType.Element: // The node is an element.   
        reader.MoveToNextAttribute(); 

        switch (reader.Value) 
        { 
         case "SourceWorkbookPath": 
          reader.MoveToNextAttribute(); 
          SourceWorkbookPath = reader.Value; 
          break; 
         case "SourceSheetName": 
          reader.MoveToNextAttribute(); 
          SourceSheetName = reader.Value; 
          break; 
         case "DestWorkbookPath": 
          reader.MoveToNextAttribute(); 
          DestWorkbookPath = reader.Value; 
          break; 
         case "DestSheetName": 
          reader.MoveToNextAttribute(); 
          DestSheetName = reader.Value; 
          break; 
         case "NumRecords": 
          reader.MoveToNextAttribute(); 
          NumRecords = Int32.Parse(reader.Value); 
          break; 
         case "DBSize": 
          reader.MoveToNextAttribute(); 
          DBSize = Int32.Parse(reader.Value); 
          break; 
        } 
        break; 
      } 
     } 
    } 

は私が動的に読み込むことができる方法はあります私が追加したいすべての変数に新しいcaseを追加する必要はありません。

+4

あなたが持っているものよりもひどいことは何もありません(ビットを再設計しない限り)。なぜあなたは 'XmlDocument'や' XDocument'ではなく 'XmlTextReader'を使っていますか? –

+3

[問題のタイトルにタグを入れないでください](https://stackoverflow.com/help/tagging) – Liam

+4

@EdPlunkett「何もひどい」という意味なら、私は同意します。 –

答えて

0

もちろん可能ですが、クラスのシリアライズが望ましいと私は同意します。

私はあなたが一致する名前を持つ最初の属性を探しているこのソリューションでは想定しています

使用し
class XmlAttributeParser 
{ 
    IEnumerable<XAttribute> attributes; 

    public XmlAttributeParser(string xml) 
    { 
     attributes = XElement.Parse(xml) 
      .DescendantsAndSelf() 
      .SelectMany(e => e.Attributes()); 
    } 

    public T GetAttribute<T>(string name) 
    { 
     return (T)TypeDescriptor.GetConverter(typeof(T)) 
      .ConvertFromString(attributes.First(a => a.Name == name).Value); 
    } 
} 

string xml = "<Root><Foo Bar=\"123\" Baz=\"456\"/></Root>"; 
XmlAttributeParser parser = new XmlAttributeParser(xml); 
int n = parser.GetAttribute<int>("Bar"); // 123 

欠点この方法には、ロードする必要があるということでファイル全体をメモリに格納し、変数を検索するたびに属性を検索する必要があります。

+0

答えをありがとう!私はこのメソッドを使用して終了しませんでしたが(シリアライゼーションははるかに明確です)、これが実行可能であることを知っておくとよいでしょう。 – RiverBanana

0

@Ed Plunkettから提供されたコメントのお陰で、私はXMLをデシリアライズしました。まず、私が情報を保持するクラスを追加しました:

public class XMLInfo 
{ 
    public int NumRecords; 
    public int DBSize; 
    public string SourceWorkbookPath; 
    public string SourceSheetName; 
    public string DestWorkbookPath; 
    public string DestSheetName; 
} 

をそして単にこのクラスのインスタンスにすべての情報をダンプする方法を書いた:これは他の誰に役立ちます

private static XMLInfo LoadXMLParameters() 
    { 
     XMLInfo info = new XMLInfo(); 

     XmlSerializer serializer = new XmlSerializer(typeof(XMLInfo)); 

     using (Stream reader = new FileStream(ParameterFilePath, FileMode.Open)) 
     { 
      return info = (XMLInfo)serializer.Deserialize(reader); 
     } 
    } 

希望を私が最初に持っていたのと同じアプローチを取った。

関連する問題