我正在尝试构建一个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
答案 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"
};
}