【问题标题】:logic to add datarow to datatable将数据行添加到数据表的逻辑
【发布时间】:2016-04-24 11:48:55
【问题描述】:

目前我正在阅读具有许多子节点并且需要将子节点的元素绑定到gridview 的xml。所以我正在遍历节点并添加数据行。但我在逻辑上有问题。我在循环 1 个节点时创建数据行。在该节点中有 2 个元素。所以它首先在第一个元素上循环,然后我将该元素绑定到行。在同一个循环中,我说添加 dt.Rows.Add(dtrow) 。所以它用一个元素添加 1 行。它再次循环并将第二个元素添加到全新的行。这是错误的。我想在同一行中添加 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.               
        }        
    }    
}

【问题讨论】:

    标签: c# xml gridview


    【解决方案1】:

    您可以仅循环遍历元素,例如 <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 中的 XML 相同


    回应您关于在没有命名空间管理器的情况下执行此操作的评论;忽略命名空间是可能的,但通常也令人不悦,因为命名空间的存在是有原因的。

    您可以使用 XPath 的 local-name() 函数来匹配元素而不考虑其命名空间,例如:

    dtrow["Title"] = vr.SelectSingleNode("*[local-name()='Title']")
                       .InnerText
                       .Trim();
    

    或使用 LINQ 匹配 XmlNodeName 属性,类似于您最初所做的:

    dtrow["Title"] = vr.ChildNodes
                       .Cast<XmlNode>()
                       .First(o => o.Name == "Title")
                       .InnerText
                       .Trim();
    

    【讨论】:

    • 我在行 vr.SelectSingleNode("Title").InnerText.Trim() 上遇到错误,因为对象引用未设置为对象的实例。
    • 我正在使用另一种方法。与您提到的上一个问题不同。我不想使用命名空间管理器。
    • @Happy 我提到了XML是否相同,而不是方法。那么,XML 还是一样的吧? (即 XML 中仍然有默认命名空间)
    • 是的,它仍然有命名空间和相同的 xml
    • @Happy 答案已更新以提供不使用命名空间管理器的替代方案
    猜你喜欢
    • 2020-01-20
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    相关资源
    最近更新 更多