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

时间:2016-04-07 19:52:07

标签: xml xaml windows-store-apps win-universal-app

创建一个UWP Windows 10应用程序,该应用程序的列表视图由漫游appdata中的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();

1 个答案:

答案 0 :(得分:0)

在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
}

班级MyList非常简单:

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

我想也许您已经完成了上述所有工作,然后我通过ListView的{​​{3}}删除了商品,并确认删除Flyout中的商品,这是我的{ {1}}:

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>

这是从XML文件中删除节点列表的代码。如果您以不同的方式和构造在XML文件中创建列表,请发布您的代码。顺便说一句,这里我们使用命名空间“Windows.Data.Xml.Dom”,而不是名称空间“System.Xml”。