0

LINQ と Generics を使用して複数の XML ファイルを保存/読み取るクラスを作成しようとしています。

複数のタイプの XML ファイル (つまり、その中のデータ) を保存する一般的な方法を探しています。

すべての XML ファイルの形式は次のとおりです。

<ROOT>
     <!-- First Element/First Row -->
     <NODE>
           <COL1>Some value</COL1>
           .....  
           <COLn>Some value</COLn>
     </NODE>
     .........
     <!-- Nth Element = nth row -->
     <NODE>
           <COL1>Some value</COL1>
           .....  
           <COLn>Some value</COLn>
     </NODE>
</ROOT>

すべてのファイルには、異なる ROOT、NODE、および COLx があります。列数とその中のデータは、Multi-Dim 配列の入力によって異なります。この入力配列は、xml 内の NODES タグの数 (配列内の要素) も提供します。

XML ファイルを保存するメソッドは次のようになります。

public void SaveFirstXmlFile()
{
    XElement xdoc = new XElement("ThisDocsRoot");
    //Iterate for number of rows(elements of data)            
    for (int nodes= 1; nodes<= NUMBER_OF_NODES; nodes++)
    {
        xdoc.Add(new XElement(row,
                              new XElement("Col 1", "Some Value"),
                              new XElement("Col 2", "Some Value"),
                              new XElement("Col 3", "Some Value")
                     ));
    } 
    xdoc.Save("/Path/To/XML/File");
}

複数の XML ファイルで機能するようにこのメソッドを微調整したかったのですが、それが正しい方法かどうかはわかりませんが、XML ファイルのルート、ノード、列、およびパスを定義するクラスを作成することにしました。データは、他のクラスによって作成された Multi-Dim Array から取得されます。

private class AClassforSomeXMLFile
{
    private readonly String _root;
    private readonly String _row;
    private readonly String[] _columns;
    private readonly String _exportPath;

    public UsageData()
    {

        _exportPath = string.Format(@"{0}\xyz.xml",Path.GetDirectoryName(Application.ExecutablePath));

        _root = "ROOT";
        _row = "NODE";
        _columns = new string[]
            {
                "COL1","COL2", "COL3","COL4",
            };
    }

    public string ROOT {  get { return _root; } }

    public string ROW { get { return _row; } }

    public string[] COLS  { get { return _columns; }}

    public string EPATH { get { return _exportPath; }}
}
4

2 に答える 2

1

AClassforSomeXMLFile クラスにコンストラクターを追加して、ルート、行、および列の値を設定し、定義のインスタンスを SaveFirstXmlFile 関数に渡すことができます。

private class XmlDefinition
{
    public string ROOT { get;set; }
    public string ROW { get;set; }
    public string[] COLS  { get;set; }
    public string EPATH { get;set; }
}


void Foo()
{
  var employeeDefinition = new XmlDefinition 
  { 
    ROOT = "Employees", 
    ROW = "Employee", 
    COLS = new[] { "Name", "Address", "Department", "Salary" },
    EPATH = string.Format(@"{0}\employee.xml",Path.GetDirectoryName(Application.ExecutablePath))
  };

  SaveFirstXmlFile(employeeDefinition); //save employees

  var productDefinition = new XmlDefinition 
  { 
    ROOT = "Products", 
    ROW = "Product", 
    COLS = new[] { "Name", "Description", "Cost" },
    EPATH = string.Format(@"{0}\products.xml",Path.GetDirectoryName(Application.ExecutablePath))
  };

  SaveFirstXmlFile(productDefinition); //save products
}

public void SaveFirstXmlFile(AClassforSomeXMLFile definition)
{
    XElement xdoc = new XElement(definition.ROOT);
    //Iterate for number of rows(elements of data)            
    for (int nodes = 1; nodes <= NUMBER_OF_NODES; nodes++)
    {
        var cols = from c in definition.COLS select new XElement(c, "Some Value");
        xdoc.Add(new XElement(definition.ROW, cols.ToArray()));
    } 
    xdoc.Save(definition.EPATH);
}
于 2013-04-30T11:37:00.013 に答える
1

ここでの質問はよくわかりませんが、このように XML をフォーマットすると満足できそうです

 <NODE>
       <COL>Some value</COL>
       .....  
       <COL>Some value</COL>
 </NODE>

そして、すべてCOLの をリストに読み込むことができます

XElement xdoc = new XElement("ThisDocsRoot");
List<XElement> Cols = xdoc.Elements("COL").ToList();
于 2013-04-29T18:28:37.213 に答える