0

我正在尝试创建一个使用 LINQ 和 Genertics 保存/读取多个 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 中节点标签的数量(数组中的元素)。

保存 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 文件的根、节点、列和路径的类。和数据来自其他一些类创建的多维数组。

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>

然后您可以将所有COLs 读入列表

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