【问题标题】:UWP list selector to delete part of xml fileUWP 列表选择器删除部分 xml 文件
【发布时间】:2016-04-07 19:52:06
【问题描述】:

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

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

之前在 silverlight 应用程序中我使用了“流”。

 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();

【问题讨论】:

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


    【解决方案1】:

    在 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文件中创建了一个“根”,在这个“根”中有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; }
    }
    

    我想也许你已经完成了以上所有工作,那么我通过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 文件中创建列表并构建,请发布您的代码。顺便说一句,这里我们使用命名空间“Windows.Data.Xml.Dom”,而不是命名空间“System.Xml”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2019-11-12
      • 2012-06-01
      相关资源
      最近更新 更多