填充xml元素表示包含标题和正文的表结构

时间:2013-07-16 19:57:10

标签: c# xml linq

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

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

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

我试图找出将字段名称添加到两个tablerow单元格的最佳方法 我的输出为

<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个单元格中的最佳方法是什么。 我动态生成单元格,以便我可以控制并确保始终存在 是每行中每个字段的一个单元格。

我很感激任何建议或想法

-Cheers

3 个答案:

答案 0 :(得分: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");

答案 1 :(得分: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))));
}

答案 2 :(得分: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"
            };
        }