DataBinding:' System.Xml.linq.XElement'不包含名称为' colorName'的属性

时间:2014-05-20 21:17:53

标签: c# asp.net xml linq

很难跟随其他示例,因为他们似乎并不遵循XML。基本上我试图将我正在查询的数据列表(LINQ to XML)绑定到转发器对象。这是我的焦点xml文件

<?xml version="1.0" encoding="utf-8" ?>
<colors>
  <color>
    <id>1</id>
    <colorName>Red</colorName>
  </color>

 <color>
    <id>2</id>
    <colorName>Orange</colorName>
 </color>

  <color>
    <id>3</id>
    <colorName>Yellow</colorName>
  </color>

  <color>
    <id>4</id>
    <colorName>Green</colorName>
  </color>

  <color>
    <id>5</id>
    <colorName>Blue</colorName>
  </color>

  <color>
    <id>6</id>
    <colorName>Indigo</colorName>
  </color>

  <color>
    <id>7</id>
    <colorName>Violet</colorName>
  </color>
</colors>

这是我的代码,它将响应下拉选择的事件:

    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        //Grab data from selected index
        string color = DropDownList1.SelectedValue;
        string inputUrl = "C:/Users/JJ/Documents/Visual Studio 2012/Projects/Colors/Colors/Xml/Colors.xml";

        using (XmlReader reader = XmlReader.Create(inputUrl))
        {
            //Read through xml file
            while (reader.Read())
            {
                //Creating the xml document object for use of the xml file
                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load(reader);

                //Creating a xDocument object for querying purposes
                XDocument colors = XDocument.Load(inputUrl);


                //List that will contain all the colors of the xml file
                XmlNodeList nameList = xmlDoc.GetElementsByTagName("colorName");
                int colorIndex = Convert.ToInt32(color)-1;

                //Will display the output in a header based off the dropdown selection
                switch (color)
                {
                    case "1":
                        outputLabel1.Text = "My favorite color is " + nameList[colorIndex].InnerXml;
                        break;
                    case "2":
                        outputLabel1.Text = "My favorite color is " + nameList[colorIndex].InnerXml;
                        break;
                    case "3":
                        outputLabel1.Text = "My favorite color is " + nameList[colorIndex].InnerXml;
                        break;
                    case "4":
                        outputLabel1.Text = "My favorite color is " + nameList[colorIndex].InnerXml;
                        break;
                    case "5":
                        outputLabel1.Text = "My favorite color is " + nameList[colorIndex].InnerXml;
                        break;
                    case "6":
                        outputLabel1.Text = "My favorite color is " + nameList[colorIndex].InnerXml;
                        break;
                    case "7":
                        outputLabel1.Text = "My favorite color is " + nameList[colorIndex].InnerXml;
                        break;
                    default:
                        outputLabel1.Text = "Please choose a color.";
                        break;
                }

                outputLabel2.Text = "List of colors remaining: ";

                var colorsLeft = from _id in colors.Descendants("colorName")
                                 //where _id.Element("id").Value != color
                                 select _id.Value;


                Repeater1.DataSource = colorsLeft;
                Repeater1.DataBind();                   
            }
        }
    }

我的XElement缺少什么,不知道&#34; colorName&#34;属性?它位于xml文件中。任何有关帮助/或更好理解的建议将不胜感激。

更新: 我正在添加用于我的转发器控件的片段,假设要绑定数据。

<asp:Repeater ID="Repeater1" runat="server">
    <ItemTemplate>
        <table>
            <tr>
                <td>
                    <asp:Label runat="server" ID="Label1" Text='<%# Bind("colorName") %>' />
                </td>
            </tr>
        </table>
    </ItemTemplate>
</asp:Repeater>

更新

我想我知道发生了什么。 Haven没有机会重新回到这里。我在转发器控件中绑定了两个不同的东西。我第一次将整个XML文件绑定为数据集,绑定识别文件中的colorName属性。但是在我的功能中,我从下拉列表中选择了不同的颜色,并且我的查询选择了剩余的颜色,结果是一个IEnumerable字符串。此IEnumerable仅包含我查询的文本值,因此当我尝试绑定新数据时,不知道colorName属性。我想这就是为什么我得到了我正在处理的错误。我错了所以请让我知道。

所以现在我必须找到一种方法来设置绑定两个不同的东西。如果我发现的是问题,任何人都有任何建议吗?

1 个答案:

答案 0 :(得分:0)

根据您的评论,问题在于LINQ-to-XML。所以我建议试试这个LINQ:

var colorsLeft = from c in colors.Descendants("color")
                 where (string)c.Element("id") != color
                 select (string)c.Element("colorName");

LINQ以上将选择未在下拉列表中选择的所有颜色名称字符串。

嗯......但是我真的不明白这与你发布的问题标题的错误信息有什么关系..

更新:

原来你还有另一个问题,我认为在你的约束声明中。绑定期望绑定源是具有名为colorName的属性的对象的集合。您可以更改绑定或更改LINQ以修复错误。

由于我无法看到你的装订,我只能举例说明后者:

var colorsLeft = from c in colors.Descendants("color")
                 where (string)c.Element("id") != color
                 select new { colorName = (string)c.Element("colorName") };

上面的LINQ返回具有单个属性colorName

的匿名对象的集合