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. 201521123076《Java程序设计》第2周学习总结

    1.本周学习总结 ①学会简单地管理原始码与位码文档(包的概念) ②了解了一些新的名词,如:完全限定(吻合)名 ③String类相关 ④in.nextInt(),in.next(),in.nextLin ...

  2. 201521123114 《Java程序设计》第12周学习总结

    1.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,double ...

  3. 多线程面试题系列(12):多线程同步内功心法——PV操作上

    上面的文章讲解了在Windows系统下实现多线程同步互斥的方法,为了提高在实际问题中分析和思考多个线程之间同步互斥问题的能力,接下来将讲解PV操作,这也是操作系统中的重点和难点.本文将会先简要介绍下P ...

  4. Spring Boot Maven Plugin(二):run目标

    简介 Spring Boot Maven Plugin插件提供spring boot在maven中的支持.允许你打包可运行的jar包或war包. 插件提供了几个maven目标和Spring Boot ...

  5. Python学习笔记010_迭代器_生成器

     迭代器 迭代就类似于循环,每次重复的过程被称为迭代的过程,每次迭代的结果将被用来作为下一次迭代的初始值,提供迭代方法的容器被称为迭代器. 常见的迭代器有 (列表.元祖.字典.字符串.文件 等),通常 ...

  6. mongodb 在windows下面进行副本建创建

    一:主从复制 1: 首先看看模型图 2: 从上面的图形中我们可以分析出这种架构有如下的好处: <1>  数据备份. <2>  数据恢复. <3>  读写分离. 3: ...

  7. 将Editplus添加到右键打开菜单

    因为自己一直用Editplus作为文本打开工具,新的电脑将压缩文件复制了过来,但是没有右键打开了. 第一打开注册表 在命令框中输入regedit 第二在注册表中输入选项 如下图所示在下拉菜单中新建Ed ...

  8. Java并发之CyclicBarrier、CountDownLatch、Phaser

    在Java多线程编程中,经常会需要我们控制并发流程,等其他线程执行完毕,或者分阶段执行.Java在1.5的juc中引入了CountDownLatch和CyclicBarrier,1.7中又引入了Pha ...

  9. UIScollview 添加UICollectionView 实现放大缩小

    创建一个空的工程 打开storyboard,添加UIScollview 设置代理 实现代理方法 - (UIView *)viewForZoomingInScrollView:(UIScrollView ...

  10. pmap 命令详解

    通过查看帮助,返回了如下信息: Usage:  pmap [options] pid [pid ...] Options: -x, --extended              show detai ...