foreach (xmlNode) 只插入第一个值

Posted

技术标签:

【中文标题】foreach (xmlNode) 只插入第一个值【英文标题】:foreach (xmlNode) only inserts the first value 【发布时间】:2019-01-24 16:46:20 【问题描述】:

我正在尝试使用 Web 服务将 MS Infopath 重复表中的值插入到 SQL server DB 中,但根据行数,只有第一个值会被插入和复制。

信息路径

SQL Server 数据库

代码

[WebMethod]
public void SubmitDocument(XmlDocument doc)

    string firstname;
    string lastname;

    XmlNamespaceManager nsManager = new XmlNamespaceManager(doc.NameTable);
    nsManager.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2018-08-16T17:55:49");
    nsManager.AddNamespace("dfs", "http://schemas.microsoft.com/office/infopath/2003/dataFormSolution");

    XmlNode root = doc.DocumentElement;
    XmlNodeList list = root.SelectNodes("/dfs:IPDocument/my:myFields/my:UserList/my:Users", nsManager);

    foreach (XmlNode node in list)
    
        firstname = node.SelectSingleNode("/dfs:IPDocument/my:myFields/my:UserList/my:Users/my:FirstName", nsManager).InnerText;
        lastname = node.SelectSingleNode("/dfs:IPDocument/my:myFields/my:UserList/my:Users/my:LastName", nsManager).InnerText;

        SubmitToDatabase(firstname, lastname);
    


public void SubmitToDatabase(string firstname, string lastname)

    try
    
        using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString))
        
            SqlCommand cmd = new SqlCommand("INSERT INTO infopathconcepttable(FirstName, LastName)VALUES(@FirstName,@LastName)", conn);

            cmd.Parameters.AddWithValue("@FirstName", firstname);
            cmd.Parameters.AddWithValue("@LastName", lastname);

            conn.Open();
            cmd.ExecuteNonQuery();
            conn.Close();
        
    
    catch (SqlException ex)
    

    

【问题讨论】:

如果你使用firstname = node.SelectSingleNode(".//my:FirstName", nsManager).InnerText;会发生什么? 嗨 Colin,非常感谢您抽出宝贵时间查看我的问题,这很有效 :) 【参考方案1】:

我相信这与在您的 SelectSingleNode() 调用中提供绝对 XPath 表达式有关。

尝试使用以下行替换两个 SelectSingleNode() 调用:

firstname = node["FirstName", nsManager.LookupNamespace("my")].InnerText;
lastname = node["LastName", nsManager.LookupNamespace("my")].InnerText;

【讨论】:

您好,医学博士,感谢您抽出宝贵时间查看我的问题。这给出了 System.NullReferenceException: Object reference not set to an instance of an object。 没问题。看起来您在@colin-young 的评论中找到了答案。如果您愿意再次尝试我的答案,也许它会像编辑过的那样工作。由于缺少命名空间引用(在编辑后的答案中添加),它可能找不到节点。 嗨,MD,再次感谢编辑后的版本也可以使用。看看 Colin 的评论,我会将其标记为解决方案。【参考方案2】:

考虑到您已经访问了 XmlNodeList,您无需在循环中重新指定要获取的节点。 如果您确定不会在源代码中获得 null 值,则类似以下内容应该会为您提供预期的结果:

foreach (XmlNode node in list)

    firstname = node.SelectSingleNode("FirstName").InnerText;
    lastname = node.SelectSingleNode("LastName").InnerText;

    SubmitToDatabase(firstname, lastname);

您还可以通过索引从节点列表中访问节点:

firstname = node["FirstName"].InnerText;
lastname = node["LastName"].InnerText;

【讨论】:

夏普,感谢您花时间查看我的问题。两个建议都给出 System.NullReferenceException: Object reference not set to an instance of an object。 以上内容并不是一个“复制粘贴”的解决方案。但我相信您已经通过 Colin 的问题找到了您想要的答案。

以上是关于foreach (xmlNode) 只插入第一个值的主要内容,如果未能解决你的问题,请参考以下文章

php foreach输出数组只输出元素的第一个字符

如何在 C# 中从 XmlNode 读取属性值?

将 XmlNode 添加到 XmlElement

Angular - 在每次 forEach 迭代后插入值

php使用foreach将值插入数组数组

将视图中的 ForEach 值插入数据库 MVC