主要的三个步骤
1.调用手机的独立存储
例如:IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication()
2.创建独立存储文件流
例如:IsolatedStorageFileStream location = new IsolatedStorageFileStream(nateText.Text + ".item", System.IO.FileMode.Create, storage);
3.读写该文件流
例如:将独立存储文件流转化为可写流
System.IO.StreamWriter file = new System.IO.StreamWriter(location);
将XML文件保存到流file上,即已经写入到手机独立存储文件上,_doc是用户创建的文件:
_doc.Save(file);
转化为可读流:
System.IO.StreamReader file = new System.IO.StreamReader(location);
解析流,转化为XML
_xml = XElement.Parse(file.ReadToEnd());
下面给出一个购物清单的例子
清单列表界面:
<Grid x:Name="LayoutRoot" Background="Transparent"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <!--TitlePanel 包含应用程序的名称和页标题--> <StackPanel Grid.Row="0" Margin="12,17,0,28"> <TextBlock Text="我的应用程序" Style="{StaticResource PhoneTextNormalStyle}"/> <TextBlock Text="购物清单" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> </StackPanel> <!--ContentPanel - 在此处放置其他内容--> <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <ListBox Margin="0,0,38,131" Name="Files"/> <Button Content="添加" Name="btn_add" HorizontalAlignment="Left" Height="104" Margin="11,493,0,0" VerticalAlignment="Top" Width="243"/> </Grid> </Grid>
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Navigation; using Microsoft.Phone.Controls; using Microsoft.Phone.Shell; using System.IO.IsolatedStorage; namespace PhoneApp1 { public partial class IsoFiles : PhoneApplicationPage { public IsoFiles() { InitializeComponent(); BindList(); btn_add.Click += btn_add_Click; } void btn_add_Click(object sender, RoutedEventArgs e) { NavigationService.Navigate(new Uri("/IsoFileAdd.xaml",UriKind.Relative)); } private void BindList() { Files.Items.Clear();//先清空一下ListBox数据 //获取应用程序的独立存储文件 using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication()) { //获取并循环*.item的存储文件 foreach (string filename in storage.GetFileNames("*.item")) { //动态构建一个Grid Grid grid = new Grid(); //定义第一列 ColumnDefinition co1 = new ColumnDefinition(); GridLength gl = new GridLength(200); co1.Width = gl; grid.ColumnDefinitions.Add(co1); //定义第二列 ColumnDefinition co2 = new ColumnDefinition(); co2.Width = gl; grid.ColumnDefinitions.Add(co2); //添加一个TextBlock显示文件名到第一列 TextBlock tblock = new TextBlock(); tblock.Text = filename; Grid.SetColumn(tblock, 0); //添加一个HyperlinkButton连接到购物详细清单页面,这是第二列 HyperlinkButton hybtn = new HyperlinkButton(); hybtn.Content = "详细信息"; GridLength glth = new GridLength(200); hybtn.Width = 200; hybtn.NavigateUri = new Uri("/IsoFilePage.xaml?name="+filename, UriKind.Relative);//传递文件名称到商品详细页面 Grid.SetColumn(hybtn, 1); grid.Children.Add(tblock); grid.Children.Add(hybtn); Files.Items.Add(grid); } } } } }
添加商品界面:
<Grid x:Name="LayoutRoot" Background="Transparent"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <!--TitlePanel 包含应用程序的名称和页标题--> <StackPanel Grid.Row="0" Margin="12,17,0,28"> <TextBlock Text="我的应用程序" Style="{StaticResource PhoneTextNormalStyle}"/> <TextBlock Text="添加商品" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> </StackPanel> <!--ContentPanel - 在此处放置其他内容--> <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <TextBlock HorizontalAlignment="Left" Height="35" Margin="23,52,0,0" TextWrapping="Wrap" Text="名称" VerticalAlignment="Top" Width="84"/> <TextBox Name="MC" HorizontalAlignment="Left" Height="64" Margin="107,36,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="251" FontSize="17"/> <TextBlock HorizontalAlignment="Left" Height="35" Margin="23,121,0,0" TextWrapping="Wrap" Text="价格" VerticalAlignment="Top" Width="84"/> <TextBox Name="JG" HorizontalAlignment="Left" Height="64" Margin="107,105,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="251" FontSize="17"/> <TextBlock HorizontalAlignment="Left" Height="35" Margin="23,185,0,0" TextWrapping="Wrap" Text="数量" VerticalAlignment="Top" Width="84"/> <TextBox Name="SL" HorizontalAlignment="Left" Height="64" Margin="107,169,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="251" FontSize="17"/> <Button Content="保存" Name="btn_add" HorizontalAlignment="Left" Height="76" Margin="257,411,0,0" VerticalAlignment="Top" Width="151"/> </Grid> </Grid>
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Navigation; using Microsoft.Phone.Controls; using Microsoft.Phone.Shell; using System.IO.IsolatedStorage; using System.Xml.Linq; namespace PhoneApp1 { public partial class IsoFileAdd : PhoneApplicationPage { public IsoFileAdd() { InitializeComponent(); btn_add.Click += btn_add_Click; } void btn_add_Click(object sender, RoutedEventArgs e) { using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication()) { XDocument _doc = new XDocument(); XElement _item = new XElement(MC.Text);//创建一个XML元素 XAttribute price = new XAttribute("price", JG.Text);//创建一个XML属性 XAttribute count = new XAttribute("count", SL.Text); _item.Add(price, count);//将这两个属性添加到XML元素上 //用_item新建一个XML的Linq文档 _doc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"), _item); //创建一个独立存储的文件流 IsolatedStorageFileStream location = new IsolatedStorageFileStream(MC.Text + ".item", System.IO.FileMode.Create, storage); //将独立存储文件流转化为可写流 System.IO.StreamWriter file = new System.IO.StreamWriter(location); //将XML文件保存到file上,即已经写入到手机独立存储文件上 _doc.Save(file); file.Dispose();//关闭可写流 location.Dispose();//关闭手机独立存储流 //调回清单主页 NavigationService.Navigate(new Uri("/IsoFiles.xaml", UriKind.Relative)); } } } }
商品详细界面:
<Grid x:Name="LayoutRoot" Background="Transparent"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <!--TitlePanel 包含应用程序的名称和页标题--> <StackPanel Grid.Row="0" Margin="12,17,0,28"> <TextBlock Text="我的应用程序" Style="{StaticResource PhoneTextNormalStyle}"/> <TextBlock Text="详细信息" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> </StackPanel> <!--ContentPanel - 在此处放置其他内容--> <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <Grid.RowDefinitions> <RowDefinition Height="63*"/> <RowDefinition Height="77*"/> <RowDefinition Height="467*"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="5*"/> <ColumnDefinition Width="19*"/> </Grid.ColumnDefinitions> <TextBlock HorizontalAlignment="Left" Height="42" Margin="22,11,0,0" TextWrapping="Wrap" Text="名称" VerticalAlignment="Top" Width="94" Grid.ColumnSpan="2"/> <TextBlock Name="MC" Grid.Column="1" HorizontalAlignment="Left" Height="42" Margin="10,11,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="242"/> <TextBlock HorizontalAlignment="Left" Height="42" Margin="22,10,0,0" TextWrapping="Wrap" Text="价格" VerticalAlignment="Top" Width="94" Grid.Row="1" Grid.ColumnSpan="2"/> <TextBlock x:Name="JG" Grid.Column="1" HorizontalAlignment="Left" Height="42" Margin="10,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="242" Grid.Row="1"/> <TextBlock HorizontalAlignment="Left" Height="42" Margin="22,10,0,0" TextWrapping="Wrap" Text="数量" VerticalAlignment="Top" Width="94" Grid.Row="2" Grid.ColumnSpan="2"/> <TextBlock x:Name="SL" Grid.Column="1" HorizontalAlignment="Left" Height="42" Margin="10,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="242" Grid.Row="2"/> <Button Content="返回购物清单" Name="btn_back" Grid.Column="1" HorizontalAlignment="Left" Height="78" Margin="149,379,0,0" Grid.Row="2" VerticalAlignment="Top" Width="182"/> </Grid> </Grid>
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Navigation; using Microsoft.Phone.Controls; using Microsoft.Phone.Shell; using System.IO.IsolatedStorage; using System.Xml.Linq; namespace PhoneApp1 { public partial class IsoFilePage : PhoneApplicationPage { public IsoFilePage() { InitializeComponent(); btn_back.Click += btn_back_Click; } void btn_back_Click(object sender, RoutedEventArgs e) { NavigationService.Navigate(new Uri("/IsoFiles.xaml", UriKind.Relative)); } //OnNavigatedTo事件是当跳转到当前的页面的时候触发的 protected override void OnNavigatedTo(NavigationEventArgs e) { string itemName = ""; //获取上一页面传过来的item值 bool itemExists = NavigationContext.QueryString.TryGetValue("name", out itemName); if (itemExists) { MC.Text = itemName; } using (IsolatedStorageFile storage=IsolatedStorageFile.GetUserStoreForApplication()) { XElement _xml;//定义Linq的XML元素 //打开独立存储文件 IsolatedStorageFileStream location = new IsolatedStorageFileStream(itemName, System.IO.FileMode.Open, storage); //转化为可读流 System.IO.StreamReader file = new System.IO.StreamReader(location); //解析流转化为XML _xml = XElement.Parse(file.ReadToEnd()); if (_xml.Name.LocalName != null) { XAttribute price = _xml.Attribute("price");//获取价格 JG.Text = price.Value.ToLower(); XAttribute count = _xml.Attribute("count");//获取数量 SL.Text = count.Value.ToLower(); MC.Text = itemName; } file.Dispose(); location.Dispose(); } base.OnNavigatedTo(e); } } }
/// <summary>
/// WP手机,XML读写类
/// </summary>
public class WPXmlRW
{
/// <summary>
/// 向WP手机,写入xml文件
/// </summary>
/// <param name="argStreamReader"></param>
/// <param name="argFileName">写入的文件名</param>
public void WriteToXml(StreamReader argStreamReader, string argFileName = "abc.xml")
{
//StreamReader sr = new StreamReader(stream123);//转化为可读流
using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication())
{
//解析流 转化为XML
XElement _xml = XElement.Parse(argStreamReader.ReadToEnd());
XDocument doc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"), _xml);
//创建一个本地存储的文件流
IsolatedStorageFileStream location = new IsolatedStorageFileStream(argFileName ,
System.IO.FileMode.Create, storage);
//将本地存储文件流转化为可写流
System.IO.StreamWriter file = new System.IO.StreamWriter(location);
//将XML文件 保存到流file上 即已经写入到手机本地存储文件上
doc.Save(file);
file.Dispose();
location.Dispose();
}
}
/// <summary>
/// 从WP手机中,读xml文件
/// </summary>
/// <param name="argFileName"></param>
/// <returns></returns>
public XElement ReadFromXml(string argFileName = "abc.xml")
{
using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication())
{
XElement _xml;//定义Linq的XML元素
//打开本地存储文件
IsolatedStorageFileStream location = new IsolatedStorageFileStream(argFileName, FileMode.Open, storage);
//转化为可读流
System.IO.StreamReader file = new System.IO.StreamReader(location);
//解析流 转化为XML
_xml = XElement.Parse(file.ReadToEnd());
file.Dispose();
location.Dispose();
if (_xml.Name.LocalName != null)
{
return _xml;
}
}
return null;
}
}
乱舞Windows Phone——xml文件读取
时间:2012-09-06 18:19 来源:博客园 作者:坠翼神祇 点击: 525次
WindowsPhone中HttpWebRequest没有提供同步通信方法,我们只能用异步调用,可以使用信号量来模拟同步通信: 这里通过AutoResetEvent对象实现,初始设置为Reset,在Response回调方法中置为Set,通过WaitOnt()控制超时时间 具体详见代码 ? xml version=1.0 ? Root LoginRequest Uid yonghu1 / Uid Password 123456 / PassworWindowsPhone中HttpWebRequest没有提供同步通信方法,我们只能用异步调用,可以使用信号量来模拟同步通信:
这里通过AutoResetEvent对象实现,初始设置为Reset,在Response回调方法中置为Set,通过WaitOnt()控制超时时间
具体详见代码
<?xml version="1.0"?> <Root> <LoginRequest> <Uid>yonghu1</Uid> <Password>123456</Password> </LoginRequest> <LoginRequest> <Uid>yonghu2</Uid> <Password>123456</Password> </LoginRequest> <LoginRequest> <Uid>yonghu3</Uid> <Password>123456</Password> </LoginRequest> </Root>public class LoginRequest { public String Uid { get; set; } public String Password { get; set; } }其次引用System.Xml.Linq;
1 var stream = Application.GetResourceStream(new Uri("/BlogTest;component/xml/Login.xml", UriKind.Relative)); 2 XElement element = XElement.Load(stream.Stream); 3 var loginList = (from el in element.Descendants("LoginRequest") 4 select new LoginRequest 5 { 6 Uid = el.Element("Uid").Value, 7 Password = el.Element("Password").Value 8 }).ToArray();2:通过XmlReader方式读取xml
这种方法通过比对节点Name以及节点NodeType来寻找自己需要解析的内容
var reader = XmlReader.Create(stream.Stream); var loginList = new List<LoginRequest>(); while (reader.Read()) { if(reader.NodeType==XmlNodeType.Element) { if(reader.Name=="LoginRequest") { var loginRequest = new LoginRequest(); while (reader.Read() && reader.NodeType!=XmlNodeType.EndElement) { if(reader.Name=="Uid") { if(reader.Read()) { loginRequest.Uid = reader.Value; } } } while (reader.Read() && reader.NodeType != XmlNodeType.EndElement) { if (reader.Name == "Password") { if (reader.Read()) { loginRequest.Password = reader.Value; } } } loginList.Add(loginRequest); } } }3:反序列化方式获取xml
这种方式常用于读取保存后的序列化xml文件,见以下链接:
http://www.cnblogs.com/zdave/archive/2011/06/01/2067282.html
本文来自坠翼神祇的博客,原文地址:http://www.cnblogs.com/xiaolongchen/archive/2012/09/05/2672316.html