2013-12-11 2 views
0

У меня есть информация xml, которая заполняется в listBox (lstAnimals). Я могу удалить из ListBox с помощью следующего кода:Как удалить запись из файла XML?

private void btnAdopt_Click(object sender, EventArgs e) 
    { 
     DialogResult result = MessageBox.Show("Complete Adoption?", "Found a Happy Home!", MessageBoxButtons.YesNo); 
     if (result == DialogResult.Yes) 
     { 

      if (lstAnimals.SelectedIndex >= 0) 
       lstAnimals.Items.Remove(lstAnimals.SelectedItem);               

     } 
     else 
     { 
      return; 
     } 

Однако, когда список обновляется/программа открыта, что вступление в повторно заполняет ListBox. Как я могу удалить это из документа XML одновременно с lixtBox?

Вот XML:

<?xml version="1.0" encoding="UTF-8"?> 
<Animals> 
    <Animal> 
    <Name>Bruce</Name> 
    <Type>Dog</Type> 
    <Age>Adult</Age> 
    </Animal> 
    <Animal> 
    <Name>Gizmo</Name> 
    <Type>Cat</Type> 
    <Age>Senior</Age> 
    </Animal> 
</Animals> 

меня спросили, как я заполнить мой ListBox, так вот код:

private void UpdateList() 
    {   
     var an = XElement.Load(@"Animals.xml") 
      .Descendants("Animal") 
      .OrderBy(xe => (xe.Element("Name").Value)) 
      .ToList<XElement>(); 

     lstAnimals.Items.Clear(); 

     foreach (var a in an) 
      lstAnimals.Items.Add(new Animal() 
      { 
       name = a.Element("Name").Value.ToString(), 
       type = a.Element("Type").Value, 
       age = a.Element("Age").Value 
      }); 
    } 

Изображение что ListBox представляет как: http://img.photobucket.com/albums/v84/Shades9323/shelterapp_zps4c22868c.jpg

+0

Показать код с ListBox. Как заполняется и удаляется/обновляется –

+0

Возможно, вы, дескриптор xml, помещали в ваш объект. Вам придется сериализовать его снова и сохранить за старым. –

+0

Я редактировал код, заполняющий список. – ScottT

ответ

0

Добавьте этот код в кнопку мыши событие

 string text = lstAnimals.SelectedItem.ToString(); 
     string animalName = text.Substring(0, text.IndexOf("is")).Trim();   
     XDocument xDoc = XDocument.Load("Animals.xml"); //here is your filepath 
     XElement element = (from x in xDoc.Descendants("Animal") 
      where x.Element("Name").Value == animalName 
      select x).First(); 
     element.Remove(); 
     xDoc.Save("Animals.xml"); 
     lstAnimals.Items.Remove(lstAnimals.SelectedItem); 

Ofcourse если добавить Id свойство ваших животных, это будет easier.Just магазин идентификатор переменной в свой ListBox Items «Tag» собственность ..

+0

Visual studio не позволит мне добавлять .Text или .SubItems после выбранного элемента. Могу ли я не использовать инструкцию? – ScottT

+0

Если у вас есть только имена животных в вашем списке, попробуйте еще раз изменить мой код .. –

+0

У меня есть строка, которая читает «имя», это «тип», который является (n) «возрастом» в списке. Я попробую изменить. – ScottT

0

Вы можете использовать XmlDocument removeChild метод похож на этот

XmlDocument doc ; 

doc = new XmlDocument(); 
doc.Load("path to your XML file"); 

XmlNode animalNode; 
XmlNode root = doc.DocumentElement; 

animalNode=root.SelectSingleNode("descendant::Animal[Name='" + lstAnimals.SelectedItem + "']"); 
doc.RemoveChild(animalNode) ; 

//save the XML file 
0

Вот как вы можете сделать это с помощью LINQ к XML

 private void btnAdopt_Click(object sender, EventArgs e) 
    { 
     DialogResult result = MessageBox.Show("Complete Adoption?", "Found a Happy Home!", MessageBoxButtons.YesNo); 
     if (result == DialogResult.Yes) 
     { 

      if (lstAnimals.SelectedIndex >= 0) 
{ 
       lstAnimals.Items.Remove(lstAnimals.SelectedItem); 
XDocument xDoc = XDocument.Load("test.xml"); 
      xDoc.Descendants("Animal").Where(x => x.Element("Name").Value.ToString() == lstAnimals.SelectedItem).Remove(); 
      xDoc.Save("test1.xml"); 

}              

     } 
     else 
     { 
      return; 
     } 
+0

Я не могу заставить это работать. Он все еще оставляет запись в XML-документе. – ScottT

Смежные вопросы