使用XmlNode.Attributes填充文本框

时间:2010-06-06 18:02:13

标签: c# xml gridview

我有Data.xml:

<?xml version="1.0" encoding="utf-8" ?>
<data>
<album>
    <slide title="Autum Leaves"
        description="Leaves from the fall of 1986"
        source="images/Autumn Leaves.jpg"
        thumbnail="images/Autumn Leaves_thumb.jpg" />
    <slide title="Creek"
        description="Creek in Alaska"
        source="images/Creek.jpg"
        thumbnail="images/Creek_thumb.jpg" />
</album>
</data>

我希望能够通过GridView编辑每个Slide节点的属性(添加了“Select”列。)到目前为止,我有:

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
    int selectedIndex = GridView1.SelectedIndex;
    LoadXmlData(selectedIndex);
}

private void LoadXmlData(int selectedIndex)
{
    XmlDocument xmldoc = new XmlDocument();
    xmldoc.Load(MapPath(@"..\photo_gallery\Data.xml"));
    XmlNodeList nodelist = xmldoc.DocumentElement.ChildNodes;
    XmlNode xmlnode = nodelist.Item(selectedIndex);
    titleTextBox.Text = xmlnode.Attributes["title"].InnerText;
    descriptionTextBox.Text = xmlnode.Attributes["description"].InnerText;
    sourceTextBox.Text = xmlnode.Attributes["source"].InnerText;
    thumbTextBox.Text = xmlnode.Attributes["thumbnail"].InnerText;
}

LoadXmlData的代码只是我的一个猜测 - 我是新手以这种方式使用xml。我想让用户从gridview中选择行,然后填充一组文本框,每个幻灯片都归属于更新回Data.xml文件。

  

我得到的错误是对象引用未设置为对象的实例“在行:titleTextBox.Text = xmlnode.Attributes [”@ title“]。InnerText;

所以我没有达到幻灯片节点的属性“title”。感谢您的任何想法。

2 个答案:

答案 0 :(得分:3)

是的 - 鉴于您的XML,xmldoc.DocumentElement.ChildNodes;语句将为您提供一个节点 - <album>节点 - 并且它没有任何名为["title"]的属性。

你需要

  • 更改您选择节点的方式; xmldoc.DocumentElement对应于<data>节点,它的.ChildNodes集合将包含所有直接子节点 - 在这种情况下是唯一的<album>节点 - 没有别的。

  • 检查是否存在! (而不只是假设它有效......)

试试这个:

XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(MapPath(@"..\photo_gallery\Data.xml"));

XmlNodeList nodelist = xmldoc.SelectNodes("/data/album/slide");

foreach(XmlNode xmlnode in nodelist)
{
    if(xmlnode.Attributes["title"] != null
       titleTextBox.Text = xmlnode.Attributes["title"].InnerText;

    if(xmlnode.Attributes["description"] != null
       descriptionTextBox.Text = xmlnode.Attributes["description"].InnerText;

    if(xmlnode.Attributes["source"] != null
       sourceTextBox.Text = xmlnode.Attributes["source"].InnerText;

    if(xmlnode.Attributes["thumbnail"] != null
        thumbTextBox.Text = xmlnode.Attributes["thumbnail"].InnerText;
}   

答案 1 :(得分:0)

@title是对属性的XPath调用,即"//slide['@title']"

XmlNode.Attributes仅按名称保存属性 - title,即node.Attributes["title"]