如何使用XmlDocument将XML数据绑定到RadioButtonList?

时间:2012-04-30 17:51:48

标签: asp.net xml c#-4.0

我在这里难过。我在使用数据库中的数据之前动态创建了RadioButtonLists,但没有使用XML。我不确定我是否想要使用相同的方法,但到目前为止我所做的并不奏效。这就是我所拥有的(stAddress是我从用户那里获得的值):

XmlDocument xAddress = new XmlDocument();
xAddress.Load("http://myxmlservice/geocode?address=" + stAddress);
XmlNodeList xNodeList = xAddress.DocumentElement.SelectNodes("response");
XmlNode address = xNodeList.Item(0).SelectSingleNode("address");
XmlNode latlong = xNodeList.Item(0).SelectSingleNode("latlng");

rbMultiAdd.DataSource = xNodeList;
rbMultiAdd.DataTextField = address.InnerText;
rbMultiAdd.DataValueField = latlong.InnerText;
rbMultiAdd.DataBind();

我一直在DataBind上遇到错误()=“DataBinding:'System.Xml.XmlElement'不包含名为'330 S Valley View Blvd'的属性。”

330 S Valley View Blvd是我的XML数据的结果之一。

由于数据是XML,我还有另一种方法吗?

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

我用@Josh发布的作为参考来解决这个问题。

XmlNodeList xNodeList = xAddress.DocumentElement.SelectNodes("response");

var addrs = new List<KeyValuePair<string, string>>();

foreach (XmlNode xNode in xNodeList)
{
   var xAddr = xNode["address"].InnerText;
   var xLatLng = xNode["latlng"].InnerText;
   addrs.Add(new KeyValuePair<string, string>(xAddr, xLatLng));   
}
rbMultiAdd.DataSource = addrs;
rbMultiAdd.DataTextField = "Key";
rbMultiAdd.DataValueField = "Value";
rbMultiAdd.DataBind();

答案 1 :(得分:1)

        //Thanks Psykopup
    // Above code works fine for me when I Put "attributes" 

     string strSP = "USP_XML_StoredProcedure";
            cmd = new SqlCommand();
            cmd.Connection = cnn;
            cmd.CommandText = strSP;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@Id", DbType.Int32).Value = 28;

            XmlReader reader = cmd.ExecuteXmlReader();

            if (reader.Read())
            {
                xdoc.Load(reader);
            }

            XmlNodeList xNodeList = xdoc.SelectNodes("/Parent/REC");

            var source = new List<KeyValuePair<string, string>>();
            foreach (XmlNode xNode in xNodeList)
            {
                var xCode = ***xNode.Attributes***["ID"].InnerText;
                var xText = ***xNode.Attributes***["Name"].InnerText;
                source.Add(new KeyValuePair<string, string>(xCode, xText));
            }

            rbListDistrict.DataSource = source;
            rbListDistrict.DataTextField = "Value";
            rbListDistrict.DataValueField = "Key";
            rbListDistrict.DataBind();

答案 2 :(得分:0)

DataTextFieldDataValueField都引用对象上的属性名称。数据绑定使用反射来查看绑定到的项目。

在这种情况下,它是XmlNode类型。其中,因为错误状态没有“330 S Valley View Blvd”类型的属性,这是InnerText的值。

在这种情况下,您可能需要将列表投影到中间类型上并将其用于绑定。有很多不同的方法,这里有一个:

XmlNodeList xNodeList = xAddress.DocumentElement.SelectNodes("response");

var addresses = xNodeList.Select(n => new KeyValuePair<String, String>(
    n.SelectSingleNode("address"), n.SelectSingleNode("latlng")))
    .ToList();

rbMultiAdd.DataSource = addresses;
rbMultiAdd.DataTextField = "Key";
rbMultiAdd.DataValueField = "Value";
rbMultiAdd.DataBind();