目前我正在阅读有许多子节点的xml,需要将子节点的元素绑定到gridview。所以我循环遍历节点并添加数据行。但我的逻辑问题。当我遍历1个节点时,我创建了datarow。在该节点中有2个元素。所以它首先在第一个元素上循环,然后将该元素绑定到行。在同一个循环中我说添加dt.Rows.Add(dtrow)。所以它添加一行一个元素。它再次循环并将第二个元素添加到全新的行中。这是错的。我想在同一行中添加2个元素。我该如何解决这个问题?
foreach (XmlNode vers in g)
{
foreach (XmlNode vr in vers)
{
foreach (XmlNode a in vr)
{
dtrow = dt.NewRow();
if (a.Name == "Title")
{
dtrow["Title"] = a.InnerText.Trim();
}
if (a.Name == "Location")
{
dtrow["Location"] = a.InnerText.Trim();
}
dt.Rows.Add(dtrow); // this causes issue.
}
}
}
答案 0 :(得分:0)
不是像那样做嵌套循环,而是只能循环遍历<e>
中的元素,比如DataTable
中的行,即<e>
的数量等于插入表的行数。在每次迭代中,都可以使用<e>
从当前SelectSingleNode()
的子元素中收集所有信息。
例如,假设vers
包含与DataTable
行对应的元素,您可以执行以下操作:
foreach (XmlNode vr in vers)
{
dtrow = dt.NewRow();
dtrow["Title"] = vr.SelectSingleNode("Title").InnerText.Trim();
dtrow["Location"] = vr.SelectSingleNode("Location").InnerText.Trim();
dt.Rows.Add(dtrow);
}
*如果此问题背后的XML与您的previous question
相同,请不要忘记使用前缀和命名空间管理器在没有命名空间管理器的情况下回复您关于这样做的评论;忽略名称空间是可能的,但通常也不赞成,因为名称空间是有原因的。
您可以使用XPath的local-name()
函数来匹配元素,而不考虑其命名空间,例如:
dtrow["Title"] = vr.SelectSingleNode("*[local-name()='Title']")
.InnerText
.Trim();
或使用LINQ匹配XmlNode
的{{1}}属性,类似于您最初的做法:
Name