WP8_读写XML WP8数据存储--独立存储文件

2 篇文章 0 订阅
2 篇文章 0 订阅
WP8数据存储--独立存储文件

主要的三个步骤

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>
复制代码
View Code
复制代码
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);
                }
            }
        }
    }
}
复制代码
View Code

添加商品界面:

复制代码
<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>
复制代码
View Code
复制代码
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));

            }

        }
    }
}
复制代码
View Code

商品详细界面:

复制代码
<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>
复制代码
View Code
复制代码
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);
        }
    }
}
复制代码
View Code

 



WP8_读写XML
/// <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 / Passwor
  

  WindowsPhone中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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值