UWP 列表选择器删除 xml 文件的一部分

UWP list selector to delete part of xml file

正在创建一个 UWP windows 10 应用程序,它有一个列表视图,该视图由漫游应用程序数据中的 xml 文件填充。

现在我想在单击列表项时在视图中编辑 xml 文件。我想我会明白,直到我删除它,但我不知道如何将它保存回来。

之前我在 silverlight 应用程序中使用了 "stream".

 var tmp1 = (Country)PhrasesList.SelectedItem;
            var tmp2 = tmp1.Name;

            string phrasesXMLPath = Path.Combine(Windows.Storage.ApplicationData.Current.RoamingFolder.Path + "/quickphrases.xml");

            XDocument doc2 = XDocument.Load(phrasesXMLPath);


            // Retrieve and remove the certain "Mapping" element with its descendants
            var deleted = doc2.Root.Descendants("item").Single(d => d.Element("name").Value == tmp2);
            deleted.Remove();

在 UWP 应用中,您可以使用 XmlDocument class 检索和创建所有 XML 个对象。

我假设您的列表显示 XML 文件中的子节点(XMLElement),而不是一个节点中的文本(XMLText),那么例如您可以在 XML 中创建节点列表并将此文件保存到应用程序的漫游文件中,如下所示:

private async void Create_File(object sender, RoutedEventArgs e)
{
    XmlDocument xdoc = new XmlDocument();
    XmlElement root = xdoc.CreateElement("List");
    xdoc.AppendChild(root);
    for (int i = 0; i < 100; i++)
    {
        XmlElement item = xdoc.CreateElement("item" + i);
        root.AppendChild(item);
    }
    XmlElement books = xdoc.CreateElement("Books");
    StorageFolder roamingFolder = Windows.Storage.ApplicationData.Current.RoamingFolder;
    StorageFile xmlFile = await roamingFolder.CreateFileAsync("XMLList.xml", CreationCollisionOption.ReplaceExisting);
    await xdoc.SaveToFileAsync(xmlFile);
}

这段代码在XML文件中创建了一个"root",在这个"root"中有100项节点,每一项都命名为"Item" + i

然后我们需要像这样将这些项目读入ListView

private ObservableCollection<MyList> mylist = new ObservableCollection<MyList>();
private async void Read_Data_Root(object sender, RoutedEventArgs e)
{
    StorageFolder roamingFolder = Windows.Storage.ApplicationData.Current.RoamingFolder;
    StorageFile xmlFile = await roamingFolder.GetFileAsync("XMLList.xml");
    XmlDocument xdoc = await XmlDocument.LoadFromFileAsync(xmlFile);
    txt.Text = xdoc.GetXml(); //show the XML representation of the node and all its descendants in a textblock.
    XmlElement root = xdoc.DocumentElement;
    mylist.Clear();
    foreach (var item in root.ChildNodes)
    {
        mylist.Add(new MyList { xmlitem = item.GetXml() });
    }  //show all items in a listview
}

classMyList就这么简单:

public class MyList
{
    public string xmlitem { get; set; }
}

我想也许你已经完成了以上所有工作,那么我通过ListViewSelectionChanged event删除项目并确认删除Flyout中的项目,这里是我的 ListView:

<ListView x:Name="listView" Grid.Row="0" SelectionChanged="Show_Delete_Button" ItemsSource="{x:Bind mylist}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding xmlitem}" />
        </DataTemplate>
    </ListView.ItemTemplate>
    <FlyoutBase.AttachedFlyout>
        <Flyout>
            <Button Content="Delete this item" Click="Delete_Data" />
        </Flyout>
    </FlyoutBase.AttachedFlyout>
</ListView>

以及删除数据的代码:

private int selectedindex;

private void Show_Delete_Button(object sender, SelectionChangedEventArgs e)
{
    FlyoutBase.ShowAttachedFlyout(sender as ListView);
    selectedindex = listView.SelectedIndex;
}

private async void Delete_Data(object sender, RoutedEventArgs e)
{
    var item = mylist.ElementAt(selectedindex);
    mylist.RemoveAt(selectedindex); //remove from listview
    StorageFolder roamingFolder = Windows.Storage.ApplicationData.Current.RoamingFolder;
    StorageFile xmlFile = await roamingFolder.GetFileAsync("XMLList.xml");
    XmlDocument xdoc = await XmlDocument.LoadFromFileAsync(xmlFile);
    XmlElement root = xdoc.DocumentElement;
    string itemstring = item.xmlitem.TrimStart('<');
    itemstring = itemstring.TrimEnd('>', '/');
    root.RemoveChild(root.GetElementsByTagName(itemstring).FirstOrDefault()); //remove from root element.
    await xdoc.SaveToFileAsync(xmlFile); //save the new list
}

这是从 XML 文件中删除节点列表的代码。如果您以不同的方式在 XML 文件中创建列表并构建,请 post 您的代码。对了,这里我们使用的是命名空间"Windows.Data.Xml.Dom",而不是命名空间"System.Xml".