UWP 对 读写 XML做了一些修改,但和之前 WPF 的方法没有大的区别。
我们先来说下什么是 XML ,
XML 其实是 树结构,可以表达复杂的结构,所以在定制要求高的、或其他方面如json 做不到的结构,那么一般就使用XML,如果XML的数据结构都做不到,那么基本上也难找到其他的结构。
XML 的优点是读写很简单,也支持定制。缺点是复杂,当然这也是他的优点。在网络传输数据,如果使用XML,相对的传输大小会比 Json 多两倍。所以是不是要用到这么高级的结构,还是看需要。
wr 很喜欢用 XML,可以看到我们的项目,*.csproj 和页面 xaml 都是XML,当然Html也是,Xml 其实还可以用作本地数据库,所以 XML 还是很重要。
本文就提供简单的方法来读写 XML 。提供方法有两个,放在前面的方法是比较垃圾的方法,放在后面的才是我希望大家使用的。
如果遇到了 C# 或 UWP 读取 xml 返回的 Node 是空,那么请检查命名空间,关于命名空间内容,请继续看博客。
<!--more-->
xml 语法
xml 一开始一般就是 文档声明
文档声明就是
<?xml version="1.0" encoding="编码方式" standalone="yes|no"?>
XML声明放在XML文档的第一行
XML声明由以下几个部分组成:
对于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相关博客:
<!-- 可以看到,我们使用 StreamReader ,于是我们在里面使用 -->
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 ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
相关推荐
在Windows 10 UWP应用开发中,常常需要创建一种用户友好的交互方式,即当用户右键点击某个元素时,能在一个特定的位置显示一个浮出菜单(MenuFlyout)。本篇文章将详细介绍如何使用C#实现这样的功能,使得MenuFlyout...
在本篇讨论中,我们将深入探讨如何在Windows 10平台上使用通用Windows平台(UWP)进行桌面编程,特别是聚焦于UWP中的焦点管理和多页面切换功能。标题提及的"UWP Focus(N之5)"暗示我们正在一系列教程中学习,而这一...
XAML是一种基于XML的语言,主要用于定义WPF(Windows Presentation Foundation)和UWP(Universal Windows Platform)应用的用户界面。在Windows 10中,XAML的使用变得更加灵活和强大,提供了更多自定义控件、动画...
- **兼容性广泛**:inspect.exe支持多种UI技术,包括Win32、COM、ActiveX、ATL、MFC,以及现代的UI框架如WPF和UWP。 2. **使用方法**: - **启动inspect.exe**:根据系统架构选择对应的inspect_x86或inspect_x64...
通过编写实际的项目,结合使用如WinMerge这样的工具,可以加深对C#语言特性和编程实践的理解。同时,不断探索和学习新的.NET框架功能和技术,如ASP.NET Core、WPF或UWP,将使你成为一个更全面的C#开发者。
3. XAML:它是微软的XML标记语言,用于定义WPF(Windows Presentation Foundation)和UWP(Universal Windows Platform)应用的用户界面。 4. DevOps:这是一个实践领域,强调开发人员和运营团队之间的协作,以实现...
在这个过程中,开发者会接触到如Win32 API、.NET Framework、UWP(通用Windows平台)以及最新的WinRT接口。 在Windows编程中,开发者需要理解窗口管理、消息队列、事件处理、多线程编程、内存管理和文件I/O等核心...
至于“C# Win8 WinRT XAML Metro-design Binding”这些标签,它们暗示了本话题适用于Windows 8及更高版本的Metro风格(现在被称为通用Windows平台,UWP)应用开发。在这些应用中,C#是常用的编程语言,WinRT提供了...
这些XML文件包含了键值对,键代表字符串ID,值则为实际的字符串内容。资源文件可以用于各种.NET项目,包括桌面应用程序、Web应用程序和移动应用。 3. **C#中的字符串资源**:在C#代码中,可以使用ResourceManager类...
XAML是一种声明式语言,用于构建WPF和UWP应用的UI。在这个文件中,你可以添加UI元素,如TextBlock,用于显示文本。例如,将以下代码插入到Grid元素中: ```xml ,20" Style="{StaticResource SubheaderTextStyle}...