Metro Style App 之XML文件读取,修改,保存等操作
采用Win RT的XML API操作XML文件。分别为加载xml文件,选择xml节点,修改xml节点的属性,最后保存xml文件。同样存在着很多异步操作(async,await)。
运行环境请参考上一篇:Metro Style App之文件访问操作示例
下图为Metro style app的API。
接下来就讲一下具体操作吧:
1、
StorageFile storageFile =
null
;
async
void
Init()
{
//加载xml文件
XmlDocument doc = await LoadXmlFile(
@"Xml\xsltTransform"
,
"xmlcontent.xml"
);
//GetXml()获得Xml文本
string
msg = doc.GetXml();
//在RichEditBox显示文本
myRichEditBox.Document.SetText(Windows.UI.Text.TextSetOptions.None, msg );
var
xpath =
"/library/book/chapter/section/paragraph/@a"
;
//选择节点的值
var
aAttributes = doc.SelectNodes(xpath);
for
(
uint
i = 0; i < aAttributes.Length; i++)
{
//修改节点的属性
aAttributes.Item(i).NodeValue =
"newValue"
;
}
//保存文件,此时修改和保存文件的路径是系统的安装路径。
doc.SaveToFileAsync(storageFile);
}
|
加载xml文件的操作为:
当前的路径为安装的本地路径,本示例为bin\debug\Filename\xmlfile
/// <summary>
/// Load Xml file
/// </summary>
private
async Task<XmlDocument> LoadXmlFile(
string
folder,
string
file)
{
StorageFolder storageFolder = await Package.Current.InstalledLocation.GetFolderAsync(folder);
storageFile = await storageFolder.GetFileAsync(file);
XmlLoadSettings loadSettings =
new
XmlLoadSettings();
loadSettings.ProhibitDtd =
false
;
loadSettings.ResolveExternals =
false
;
return
await XmlDocument.LoadFromFileAsync(storageFile, loadSettings);
}
|
注意: loadSettings.ProhibitDtd = false; loadSettings.ResolveExternals = false; 安全设置都要成false,否则会有异常。 还有Win 8中文件访问已经发生了一些变化,使用StorageFolder等。
xml文件如下:
<library>
<book>
<chapter></chapter>
<chapter>
<section>
<paragraph a=
"b"
>1</paragraph>
<paragraph a=
"b"
>2</paragraph>
</section>
</chapter>
</book>
</library>
|
修改后的xml文件:
<library>
<book>
<chapter></chapter>
<chapter>
<section>
<paragraph a=
"newValue"
>1</paragraph>
<paragraph a=
"newValue"
>2</paragraph>
</section>
</chapter>
</book>
</library>
|
2、修改某个节点的值
var
xnodepath =
"/library/book/chapter/section/paragraph"
;
|
var
nodeList = doc.SelectNodes(xnodepath);
for
(
uint
i = 0; i < nodeList.Length; i++)
{
IXmlNode node = nodeList.Item(i);
if
(node.Attributes[0].NodeValue.ToString() ==
"one"
)
{
node.FirstChild.NodeValue =
"New node Value"
;
}
}
|
上面是修改节点属性为one的节点值。
总结:Win RT多xml的操作与原来的还是有一些区别的。
下面是我以前总结的XML操作,你会发现他们到底有哪些区别:
C#操作xml SelectNodes,SelectSingleNode总是返回NULL 与 xPath 介绍
C#中用SelectSingleNode方法解析带有多个命名空间的XML文件
以上只是自己的一点学习心得,如果有什么意见和建议,当然自己还在学习研究中。欢迎大家提出,共同学习,一起进步。
留个问题给大家:
当xml文件增加命名空间属性时('http://www.microsoft.com'),如何获得节点的信息;
xml文件如:
<library xmlns=
'http://www.microsoft.com'
>
<book>
<chapter></chapter>
<chapter>
<section>
<paragraph a=
"one"
>1</paragraph>
<paragraph a=
"two"
>2</paragraph>
</section>
</chapter>
</book>
</library>
|
如果用doc.SelectNodesNS方法,又该如何使用呢?
答:
doc.LoadXml(·
"<urlset xmlns='http://www.foo.com'><url xmlns='http://www.bar.com'><loc>http://www.far.com</loc></url></urlset>"
);
Windows.Foundation.Collections.PropertySet ns =
new
Windows.Foundation.Collections.PropertySet();
ns.Add(
"foo"
,
"http://www.foo.com"
);
ns.Add(
"bar"
,
"http://www.bar.com"
);
node = doc.SelectSingleNodeNS(
"/foo:urlset/bar:url/bar:loc"
, ns);
或者
doc.LoadXml(·
"<urlset xmlns='http://www.foo.com'><url xmlns='http://www.bar.com'><loc>http://www.far.com</loc></url></urlset>"
);
node = doc.SelectSingleNodeNS(
"/foo:urlset/bar:url/bar:loc"
,
"xmlns:foo='http://www.foo.com' xmlns:bar='http://www.bar.com'"
);
|
本文转自Work Hard Work Smart博客园博客,原文链接:http://www.cnblogs.com/linlf03/archive/2012/03/13/2392278.html,如需转载请自行联系原作者