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; }
}
我想也许你已经完成了以上所有工作,那么我通过ListView
的SelectionChanged 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".
正在创建一个 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; }
}
我想也许你已经完成了以上所有工作,那么我通过ListView
的SelectionChanged 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".