Заполните текстовые поля XmlNode.Attributes - PullRequest
2 голосов
/ 06 июня 2010

У меня есть 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>

Я бы хотел иметь возможность редактировать атрибуты каждого узла Slide через GridView (к которому добавлен столбец «Выбрать».) И до сих пор у меня есть:

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 таким образом. Я бы хотел, чтобы пользователь спрятал строку в виде сетки, а затем заполнил набор текстовых полей каждым слайдом, который приписывается для обновления обратно в файл Data.xml.

Я получаю ошибку: ссылка на объект не установлена ​​для экземпляра объекта "в строке: titleTextBox.Text = xmlnode.Attributes [" @ title "]. InnerText;

поэтому я не достигаю атрибута "title" узла слайда. Спасибо за любые ваши идеи.

Ответы [ 2 ]

3 голосов
/ 06 июня 2010

Хорошо, да - учитывая ваш 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;
}   
0 голосов
/ 07 июня 2010

@title - это вызов XPath для атрибутов, т.е. "//slide['@title']"

XmlNode.Attributes содержит атрибуты только по имени - title, т.е. node.Attributes["title"]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...