0

我正在尝试使用 linq to xml 构建一个表示包含行和单元格的表的 xml 结构。例子:

<table>
    <tablerow>
        <cell></cell>
        <cell></cell>
        <cell></cell>
    </tablerow>
    <tablerow>
        <cell></cell>
        <cell></cell>
        <cell></cell>
        </tablerow>
</table>

第一行用作标题,第二行包含字段值。在对象中,我从名称中提取名称是相同的

我正在尝试找出将字段名称添加到两个表格单元格的最佳方法,以便输出为

<table>
    <tablerow>
        <cell>Field1</cell>
        <cell>Field2</cell>
        <cell>Field3</cell>
    </tablerow>
    <tablerow>
        <cell>Field1</cell>
        <cell>Field2</cell>
        <cell>Field3</cell>
    </tablerow>
</table>

我目前正在检索所有单元格元素

var cells = doc.Descendants(tablerow).Descendants(cell);

然后使用 foreach 使用普通插入.add()

foreach (c in cells)
{
  c.add(//XElement content...);
}

我的问题是,如果我只有 3 个字段(但 6 个单元格),将它们填充到 6 个单元格中的最佳方法是什么。我动态生成单元格,因此我可以控制并确保每行中的每个字段始终有一个单元格。

我很感激任何建议或想法

-干杯

4

3 回答 3

1

你可以这样做:

var fieldNames = new[] { "Field1", "Field2", "Field3" };
var doc = XDocument.Load("c:/somewhere.xml").Root;

foreach (var row in doc.Elements("tablerow"))
{
    var i=0;  // index into fieldNames array
    foreach (var cell in row.Elements("cell"))
    {
        cell.Add(new XText(fieldNames[i++]));  // take one, and increment
    }
}
doc.Save("c:/somewhere.xml");
于 2013-07-17T10:58:20.727 回答
0

如果有帮助,您可以使用以下方法从头开始创建它:

var fieldNames = new[] { "Field1", "Field2", "Field3" };

var doc = new XElement("table");
doc.Add(CreateTableRowElement(fieldNames));
doc.Add(CreateTableRowElement(fieldNames));
doc.Save("c:/file.xml");

和辅助功能

private XElement CreateTableRowElement(string[] fieldNames)
{
    return new XElement("tablerow", fieldNames.Select(name => 
        new XElement("cell", new XText(name))));
}
于 2013-07-16T20:10:36.177 回答
0

感谢 CSJ 引导我朝着正确的方向前进,他的答案是正确的答案,但我想分享我的代码,因为我的实现有点不同。这是我在控制台应用程序中模拟的完整工作示例。- 干杯

static void Main(string[] args)
        {
            XDocument xd = CreateXml();
            List<string> stuff = GeneratList();
            PopulateArray(stuff, xd);
        }

        private static XDocument PopulateArray(List<string>mylist, XDocument xmlFile)
        {
            var row = xmlFile.Descendants("tablerow");

            foreach (var r in row)
            {
                var i = 0;
                var cell = r.Descendants("cell");
                foreach (var c in cell)
                {
                    c.Add(new XText(mylist[i++]));
                }
            }
            return xmlFile;
        }

        private static XDocument CreateXml()
        {
            XDocument doc = new XDocument(
                new XElement("table",
                    new XElement("tablerow",
                        new XElement("cell"),
                        new XElement("cell"),
                        new XElement("cell")
                    ),
                new XElement("tablerow",
                        new XElement("cell"),
                        new XElement("cell"),
                        new XElement("cell")
                    )           
                )     
                );
            return doc;
        }

        private static List<string> GenerateList()
        {
            return new List<string> {
                "Orange",
                "Grape",
                "Banana"
            };
        }
于 2013-07-17T14:34:39.393 回答