UWP 对 读写 XML做了一些修改,但和之前 WPF 的方法没有大的区别。

我们先来说下什么是 XML ,

XML 其实是 树结构,可以表达复杂的结构,所以在定制要求高的、或其他方面如json 做不到的结构,那么一般就使用XML,如果XML的数据结构都做不到,那么基本上也难找到其他的结构。

XML 的优点是读写很简单,也支持定制。缺点是复杂,当然这也是他的优点。在网络传输数据,如果使用XML,相对的传输大小会比 Json 多两倍。所以是不是要用到这么高级的结构,还是看需要。

wr 很喜欢用 XML,可以看到我们的项目,*.csproj 和页面 xaml 都是XML,当然Html也是,Xml 其实还可以用作本地数据库,所以 XML 还是很重要。

本文就提供简单的方法来读写 XML 。提供方法有两个,放在前面的方法是比较垃圾的方法,放在后面的才是我希望大家使用的。

如果遇到了 C# 或 UWP 读取 xml 返回的 Node 是空,那么请检查命名空间,关于命名空间内容,请继续看博客。

xml 语法

xml 一开始一般就是 文档声明

文档声明就是

<?xml version="1.0" encoding="编码方式" standalone="yes|no"?>

XML声明放在XML文档的第一行

XML声明由以下几个部分组成:

  • version 文档符合XML1.0规范

  • encoding 文档字符编码,比如”gb2312”

  • standalone 文档定义是否独立使用

  • standalone=”yes” 可选

  • standalone=”no” 默认

对于XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理。

属性值用双引号(”)或单引号(’)分隔

如果希望知道更多,请看:http://www.cnblogs.com/yaoyinglong/p/xml.html

下面就是一个 xml 的读写方法。

XmlDocument

在 UWP 如果需要 读取解析xml

我们可以使用 XmlDocument 。

一开始需要创建 XmlDocument ,创建 XmlDocument 有三个方法,首先是从 StorageFile 创建。

            XmlDocument.LoadFromFileAsync(file);   读取xml

注意要等待。

第二方法:从Uri创建,XmlDocument.LoadFromUriAsync(uri);

第三方法:先创建一个 XmlDocument 然后使用 Load


            XmlDocument doc = new XmlDocument();

            doc.LoadXml(str);

注意str是字符串。

读取xml之后需要解析。

如果想在 xml 中获取某个标签,假如我们获取的是 Page.xaml 的 TextBlock ,那么我们可以遍历一次 doc.FirstChild

            var grid=doc.FirstChild.ChildNodes;
            for (var i = 0; i < grid.Count; i++)
            {
                var temp = grid[i];
                if (temp.NodeName == "TextBlock")
                {

                }
            }

大概是一个垃圾办法,我在下面写一个简单的方法,一般放在最前写的就是最垃圾的方法。

获取了标签,我们还想获取属性,我们可以使用 IXmlNode 的 Attributes 。Attributes 就是所有的属性,假如我们想得到 TextBlock 的 Name ,那么可以使用

                    foreach (var attribute in temp.Attributes)
                    {
                        if (attribute.NodeName == "Name")
                        {
                            name = "TextBlock" + attribute.InnerText;
                        }
                    }

如果你想用 Linq 去查而不使用循环,那么我希望你看到下面的 [Linq读写 XML](# Linq 读写 XML)再写代码,我下面有一个简单的方法。

如何去写入或创建节点,请看:http://www.cnblogs.com/zery/p/3362480.html

需要注意的是,如果属性有明明空间,那么刚才的方法是比较难用的。

Linq 读写 XML

这个是我推荐的方法。

首先来说下如何从文件创建 xml ,我们需要使用

            XDocument doc = XDocument.Load(new StreamReader(
                await file.OpenStreamForReadAsync()));

如果需要从字符串创建,那么使用

XDocument.Load(new StringReader(str));

使用的时候,需要using System.Xml.Linq;

我们还是来读一个 xaml ,假如我们想拿出所有的 TextBlock ,那么我们有简单的方法。

            var page = doc.Root;
            var name = page.Name.NamespaceName;

            var textBlockList = page.Descendants(XName.Get("TextBlock", name));

注意,我们的 Descendants 参数是 XName,需要使用命名空间,一开始我就不知道需要命名空间,总是没找到 TextBlock 。希望大家在网上看到的博客写的是 string 记住我们的 Descendants 参数是 XName 。

因为我们 xaml 的 TextBlock 是使用命名空间,和简单的 xml 不同,当然,xml 也是可以使用命名空间。其实不可以去责怪大神们没有写 Descendants 的参数是 XName ,因为我们基本遇到的 XML 都不会用到 命名空间。

那么我们就可以简单从 xaml 拿出所有的 TextBlock ,不管他放在多少个 Grid 里。

看到上面的图片,放了5层的 TextBlock 也可以拿到。

然后我们如何拿到属性,在知道属性的名称情况,可以使用temp.Attribute("属性名")?.Value来获得,Attribute 的参数是 XName,那么 为何我们还直接用 string,原因是除了开始用冒号分开的属性,如x:Name,其他的都可以直接使用 string。

那么如果是x:Name的属性,我们需要使用 x 的命名空间 http://schemas.microsoft.com/winfx/2006/xaml

                string textname = textBlock.Attribute(XName.Get("Name", "http://schemas.microsoft.com/winfx/2006/xaml"))?.Value;

获取完属性,我们需要知道如何添加属性。

我们可以使用 SetAttributeValue 来添加删除属性。

假如我们添加 x:Uid ,value 是 name

                textBlock.SetAttributeValue(XName.Get("Uid", "http://schemas.microsoft.com/winfx/2006/xaml"), name);

如果我们要删除 Text ,那么使用 textBlock.SetAttributeValue("Text",null);

value 是 null,就删除属性。

说完如何添加属性,那么如何添加 node

我们需要用到 XElement

假如我们要添加一个

<node name="lindexi"/>

那么我们可以使用

                            var node=new XElement("node");
                            node.SetAttributeValue("name","lindexi");
                            doc.Root.Add(node);

写完保存doc.Save(await file.OpenStreamForWriteAsync());

XDocument 和 WPF 的CUID都一样,如果需要删除或其他的方法,请去找WPF的方法。

我使用 XDocument 把 *.csproj 的所有文件拿出来,代码:https://gist.github.com/lindexi/813e4b7111c16ac7b8a5149f44226e30

最近看 xml 是因为我在写一个多语言自动拿出来的工具。名字还没想好,功能大概是我们在写一个Xaml ,因为之前没有想做多语言,于是我们把所有的 TextBlock 都写了 Text ,没有写 Uid,在想做多语言时,我们需要拿出所有的 Text 的文字,给每个 TextBlock 一个 Uid,写在 resw 。如果我有 100000 个 TextBlock ,那么对每个 TextBlock 的操作是拿出 Text,在资源写上 uid 和粘贴 Text,返回 TextBlock 写 Uid,大概5个操作。那么我们就需要做 500000 次。

我这个软件可以帮助大家,自动拿出 TextBlock 的Text 放在资源文件。

还没做出来,所以就不说啦。

下面是我看到的xml相关博客:

http://www.cnblogs.com/portalsky/archive/2008/09/11/1289461.html

http://blog.csdn.net/cdjcong/article/details/8473539

http://blog.csdn.net/ht_zhaoliubin/article/details/38900275

http://www.cnblogs.com/zery/p/3362480.html

关于命名空间:https://msdn.microsoft.com/en-us/library/aa468565.aspx?f=255&MSPPError=-2147217396

WPF 读XML

可以 XmlDocument 读 xml ,如果遇到命名空间问题

建议:XmlNamespaceManager

假设一个属性存在命名控件,必须使用 XmlNamespaceManager ,如果没有,SelectSingleNode 返回空。

那么可以使用 XmlNamespaceManager ,但是需要知道 xml 的内容,因为需要拿到空间。

新建一个 XmlNamespaceManager :

    new XmlNamespaceManager(document.NameTable)
            {

            };

但是需要设置空间,XmlNamespaceManager.AddNamespace("随意名称", NamespaceURI);

如果看不懂上面写的,请看例子

假如要读取项目xml,也就是C#项目文件

    <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
</Project>

可以使用

            XmlDocument document = new XmlDocument();
            document.Load("1.xml");
            var temp = new XmlNamespaceManager(document.NameTable)
            {

            };
            temp.AddNamespace("xm", document.DocumentElement.NamespaceURI);
            XmlNode root = document.SelectSingleNode("xm:Project",temp);
            XmlNode t = root.SelectSingleNode("xm:Import",temp);


本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

win10 uwp 读写XML的更多相关文章

  1. win10 UWP读写文件

    C# uwp应用的文件读写最常见错误就是没有权限. 而最简单的方法是对已知的文件路径进行访问 已知的文件路径常见的是自身的路径 权限这个和之前不同,UWP读写文件多用StorageFile来读写文件 ...

  2. win10 UWP 序列化

    将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象. .NET Framewor ...

  3. win10 uwp 如何开始写 uwp 程序

    本文告诉大家如何创建一个 UWP 程序. 这是一系列的 uwp 入门博客,所以写的很简单 本文来告诉大家如何创建一个简单的程序 安装 VisualStudio 在开始写 UWP 需要安装 Visual ...

  4. win10 uwp 手把手教你使用 asp dotnet core 做 cs 程序

    本文是一个非常简单的博客,让大家知道如何使用 asp dot net core 做后台,使用 UWP 或 WPF 等做前台. 本文因为没有什么业务,也不想做管理系统,所以看到起来是很简单. Visua ...

  5. Win10/UWP开发—使用Cortana语音与App后台Service交互

    上篇文章中我们介绍了使用Cortana调用前台App,不熟悉的移步到:Win10/UWP开发—使用Cortana语音指令与App的前台交互,这篇我们讲讲如何使用Cortana调用App的后台任务,相比 ...

  6. 【Win10 UWP】后台任务与动态磁贴

    动态磁贴(Live Tile)是WP系统的大亮点之一,一直以来受到广大用户的喜爱.这一讲主要研究如何在UWP应用里通过后台任务添加和使用动态磁贴功能. 从WP7到Win8,再到Win10 UWP,磁贴 ...

  7. win10 uwp 入门

    UWP是什么我在这里就不说,本文主要是介绍如何入门UWP,也是合并我写的博客. 关于UWP介绍可以参见:http://lib.csdn.net/article/csharp/32451 首先需要申请一 ...

  8. win10 uwp smms图床

    本文,如何使用smms图床上传图片,用到win10 uwp post文件,因为我是渣渣,如果本文有错的,请和我说,在本文评论,或发给我邮箱lindexi_gd@163.com,请不要发不良言论 找到一 ...

  9. win10 uwp 如何打包Nuget给其他人

    原文:win10 uwp 如何打包Nuget给其他人 本文告诉大家,如果自己有做一些好用的库,如何使用 Nuget 打包之后上传,分享给大家. 首先需要知道一些 Nuget 打包需要知道的,请看 wi ...

随机推荐

  1. 【Alpha阶段】第四次scrum meeting

    一.会议照片 二.会议内容 姓名 学号 负责模块 昨日任务完成度 今日任务 杨爱清 099 界面设计和交互功能 完成 百度合适的背景图片 杨立鑫 100 数据库搭建和其他 完成 开始编辑数据库 林 钊 ...

  2. java课程设计——猜数游戏个人博客

    1.团队课程设计链接 团队博客:http://www.cnblogs.com/springbreezemiles/p/7064135.html 2.个人负责模块 猜数部分的算法及代码实现. 3.自己的 ...

  3. 201521123101 《Java程序设计》第12周学习总结

    1. 本周学习总结 2. 书面作业 将Student对象(属性:int id, String name,int age,double grade)写入文件student.data.从文件读出显示. 1 ...

  4. 201521044091 java 第十周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. Runnable不是线程,Thread才是,必须将实现Runnable接口的类的对象放入Thread中才能在 ...

  5. 实际用户ID,有效用户ID及设置用户ID

    实际用户ID,有效用户ID和设置用户ID 看UNIX相关的书时经常能遇到这几个概念,但一直没有好好去理清这几个概念,以致对这几个概念一直一知半解.今天好好区分了一下这几个概念并总结如下.说白了这几个U ...

  6. python读取外部文件

    >>> pd.read_excel('c://111.xlsx') 年度排名 历史排名 电影名称 总票房 总人次 总场次 上映年份 操作 0 1 1 美人鱼 NaN -- -- 20 ...

  7. 解决python第三方插件下载慢的方法

    在CMD中输入: pip install 插件名字 --trusted-host pypi.douban.com -i http://pypi.douban.com/simple 就是更换国内源

  8. mysql 1093错误

    1093错误:修改一个表的时候子查询不能是同一个表 解决办法:把子查询再套一层,变成原来表的孙子查询就可以了 例如: INSERT INTO gg SET id3=(SELECT c.a+1 FROM ...

  9. Git 基本命令有哪些

    Git 相关命令 git init 初始化一个项目 git clone 利用url 从远程clone下来一个项目 git status 查看当前项目修改状态 git log 查看日志 查看历史记录 g ...

  10. JVM菜鸟进阶高手之路二(JVM的重要性,Xmn是跟请求量有关。)

    转载请注明原创出处,谢谢! 今天看群聊jvm,通常会问ygc合适吗? 阿飞总结,可能需要2个维度,1.单位时间执行次数,2.执行时间 ps -p pid -o etime 查看下进程的运行时间, 17 ...