循环遍历.net中的xml

时间:2009-10-06 11:15:30

标签: c# .net xml

我在.net中循环一些xml并将Xml元素分配给字符串变量。

这些变量被传递到一个带有三个参数的方法中。该方法在SQL Server 2005中运行存储过程,该存储过程使用这三个参数查询数据库。

手动传递参数时,方法和sproc运行正常。但是当我尝试从xml文件中获取参数时,Visual Studio说“过程或函数usp_CreateOrgDataSet指定了太多参数。”

这是以下方法的代码

private void GenChart_Click(object sender, EventArgs e)
    {


        //Open Connection
        conn_Org.ConnectionString = Set_OrgChartConn();
        conn_Org.Open();

                //Load xml Config file
                XmlDocument doc = new XmlDocument();
                doc.Load("Config.xml");

                XmlElement root = doc.DocumentElement;
                XmlNodeList nodes = root.SelectNodes("/root/Org");

                foreach (XmlNode  node in nodes)
                {
                    string Title1 = node["OC_Ttl1"].InnerText;
                    string Title2 = node["OC_Ttl2"].InnerText;
                    string OrgName = node["OC_OL31"].InnerText;



                    //Grab Chart data
                    GetChartData(Title1, Title2, OrgName);
                }
        conn_Org.Close();


                }

这是getChartdate方法

private  void GetChartData(string OC_Ttl1, string OC_Ttl2, string OC_OL31)
    {
        OC_Ttl_1 = OC_Ttl1;
        OC_Ttl_2 = OC_Ttl2;
        OC_OL3_1 = OC_OL31;



        //Execute Stored Procedure
        cmd_Org.Connection = conn_Org;
        cmd_Org.CommandText = "dbo.usp_CreateOrgDataSet";
        cmd_Org.CommandType = CommandType.StoredProcedure;
        cmd_Org.Parameters.AddWithValue("@OC_Ttl_1", OC_Ttl1);
        cmd_Org.Parameters.AddWithValue("@OC_Ttl_2", OC_Ttl1);
        cmd_Org.Parameters.AddWithValue("@OC_OL3_1", OC_OL31);


        //Output xml
        DataSet orgDataSet = new DataSet();
        orgDataSet.ReadXml(cmd_Org.ExecuteXmlReader(), XmlReadMode.Auto);
        orgDataSet.WriteXml("InputXMLFiles/" + OC_OL3_1.Replace(" ","_") + ".xml");





    }

这是XML

<?xml version="1.0" encoding="utf-8"?>  
<root>  
  <Org>  
    <OC_Ttl1>Test1</OC_Ttl1>
    <OC_Ttl2>Test1</OC_Ttl2>
    <OC_OL31>OrgName1</OC_OL31>  
  </Org>
  <Org>
    <OC_Ttl1>Test2</OC_Ttl1>
    <OC_Ttl2>Test2</OC_Ttl2>
    <OC_OL31>OrgName2</OC_OL31>
  </Org>
  <Org>
    <OC_Ttl1>Test3</OC_Ttl1>
    <OC_Ttl2>Test3</OC_Ttl2>
    <OC_OL31>OrgName3</OC_OL31>
  </Org> 
</root>

在错误点处,locals窗口具有以下值:

OC_Ttl1“Test2”字符串   OC_Ttl2“Test2”字符串   OC_OL31“OrgName2”字符串

第一次迭代成功,但第二次失败。

4 个答案:

答案 0 :(得分:2)

简而言之 - 我不认为这与您的xml代码或任何代码有任何关系 发布。我希望您必须澄清其他代码(GetChartData)为我们提供的帮助。

好吧,对我来说:

foreach (XmlNode node in nodes)
{
    string Title1 = node["OC_Ttl1"].InnerText;
    string Title2 = node["OC_Ttl2"].InnerText;
    string OrgName = node["OC_OL31"].InnerText;

     Console.WriteLine(Title1 + "/" + Title1 + "/" + OrgName);
}

输出:

Test1/Test1/OrgName1
Test2/Test2/OrgName2
Test3/Test3/OrgName3

所以似乎工作正常。高音检查您的xml,并高音检查您的报告方法(GetChartData)。在您发布的代码中,这一切似乎都很好。

答案 1 :(得分:2)

您将在每次迭代时向命令添加参数,这将导致第二次迭代抛出此错误。您需要添加一次参数,然后在每次迭代时设置值。您还可以通过确保cmd_Org的范围限定在GetChartData中来解决此问题。

private  void GetChartData(string OC_Ttl1, string OC_Ttl2, string OC_OL31)
    {
        OC_Ttl_1 = OC_Ttl1;
        OC_Ttl_2 = OC_Ttl2;
        OC_OL3_1 = OC_OL31;


        //Execute Stored Procedure
        SqlCommand cmd_Org.Connection = conn_Org;
        cmd_Org.CommandText = "dbo.usp_CreateOrgDataSet";
        cmd_Org.CommandType = CommandType.StoredProcedure;
        cmd_Org.Parameters.AddWithValue("@OC_Ttl_1", OC_Ttl1);
        cmd_Org.Parameters.AddWithValue("@OC_Ttl_2", OC_Ttl1);
        cmd_Org.Parameters.AddWithValue("@OC_OL3_1", OC_OL31);


        //Output xml
        DataSet orgDataSet = new DataSet();
        orgDataSet.ReadXml(cmd_Org.ExecuteXmlReader(), XmlReadMode.Auto);
        orgDataSet.WriteXml("InputXMLFiles/" + OC_OL3_1.Replace(" ","_") + ".xml");





    }

答案 2 :(得分:0)

你正在执行的sp和sql的原型是什么?

您是否只是在每个迭代循环中追加一个查询?

将该功能放入问题中。

答案 3 :(得分:0)

无需从文档元素开始。实际上,尝试将// Org作为节点列表的xpath。