C#中用SelectSingleNode方法解析带有多个命名空间的XML文件

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:

 今晚在博问看到一个问题:查找xml文件中特定属性值的节点,给它增加一个新属性,本以为很简单,随手写了一个程序,却遇到了问题,主要是多个命名空间的原因,查找了一些资料最终解决了,现把解决的办法分享出来,大家如果有更好的方案欢迎留言讨论。

  XML文件如下:

<?xml version="1.0" encoding="utf-8" ?>
<Enginuity:ViewControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d
="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc
="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:Enginuity
="clr-namespace:Enginuity.Core;assembly=Enginuity.Core">
<Viewbox Stretch="Fill">
<TextBox Name="Text_10" Value="abc"/>
<TextBox Name="Text_11" Value="bcd"/>
</Viewbox>
</Enginuity:ViewControl>

  这里小小提示一下,Enginuity:ViewControl 这种写法表示ViewControl的命名空间为Enginuity。

  现在要得到的是Name为Text_10的TextBox结点的Value属性值:abc。

  关于SelectSingleNode方法大家可以参考:http://msdn.microsoft.com/en-us/library/h0hw012b.aspx

  这个方法有两个参数,第一个是string xpath,这个是必须的,第二个是XmlNamespaceManager nsmgr,这个可选。重要的一点就是xpath的写法,主要就是命名空间:节点/命名空间:节点/...,官方给的示例中只有一个命名空间,xml结构相对比较简单。

  从上面的XML文件中很容易看出ViewControl的命名空间是Enginuity,但ViewBox的命名空间是什么呢?查找了XML文件命名空间的定义后,发现有这么一句”如果Xml文档里没有明确指出当前节点的命名空间,那么当前节点的命名空间继承其父节点的命名空间“,ViewBox的父节点是ViewControl,ViewControl的命名空间是Enginuity,同时注意到Enginuity还不是最终的命名空间,Enginuity的命名空间是xmlns,那么是哪一个呢?

  动手试呗,于是写出下面的程序:

            XmlDocument dom = new XmlDocument();
dom.Load(
@"E:\NET\test.xml");
XmlNamespaceManager xnm
=new XmlNamespaceManager(dom.NameTable);
xnm.AddNamespace(
"e", "http://schemas.microsoft.com/winfx/2006/xaml/presentation");
xnm.AddNamespace(
"x", "http://schemas.microsoft.com/winfx/2006/xaml");
xnm.AddNamespace(
"d", "http://schemas.microsoft.com/expression/blend/2008");
xnm.AddNamespace(
"mc", "http://schemas.openxmlformats.org/markup-compatibility/2006");
xnm.AddNamespace(
"Enginuity", "clr-namespace:Enginuity.Core;assembly=Enginuity.Core");
XmlNodeList xNodes
= dom.SelectSingleNode("Enginuity:ViewControl", xnm).ChildNodes;
Console.WriteLine(xNodes[
0].NamespaceURI);

  结果如下:

  可以看到,ViewControl的命名空间为最顶及的xmlns,于是写出下面的程序:

            XmlDocument dom = new XmlDocument();
dom.Load(
@"E:\NET\test.xml");
XmlNamespaceManager xnm
=new XmlNamespaceManager(dom.NameTable);
xnm.AddNamespace(
"e", "http://schemas.microsoft.com/winfx/2006/xaml/presentation");
xnm.AddNamespace(
"x", "http://schemas.microsoft.com/winfx/2006/xaml");
xnm.AddNamespace(
"d", "http://schemas.microsoft.com/expression/blend/2008");
xnm.AddNamespace(
"mc", "http://schemas.openxmlformats.org/markup-compatibility/2006");
xnm.AddNamespace(
"Enginuity", "clr-namespace:Enginuity.Core;assembly=Enginuity.Core");
XmlNode xNode
= dom.SelectSingleNode("Enginuity:ViewControl/e:Viewbox/e:TextBox[@Name='Text_10']", xnm);
Console.WriteLine(xNode.Attributes[
"Value"].Value);

  运行后效果如下:

  期待中的”abc“终于出现了。

  因此,得出一个结论,在用SelectSingleNode方法解析含有多个命名空间的XML文件时,没有明确标出命名空间的节点,其命名空间为根节点的命名空间。如果还不确定可以从根节点开始,逐层输出该级节点的命名空间。

  keyword:SelectSingleNode,C#解析XML文件,SelectSingleNode多命名空间,



本文转自Artwl博客园博客,原文链接:http://www.cnblogs.com/artwl/,如需转载请自行联系原作者

相关文章
|
2月前
|
C#
基于 C# 编写的 Visual Studio 文件编码显示与修改扩展插件
基于 C# 编写的 Visual Studio 文件编码显示与修改扩展插件
|
3月前
|
JSON 程序员 C#
使用 C# 比较两个对象是否相等的7个方法总结
比较对象是编程中的一项基本技能,在实际业务中经常碰到,比如在ERP系统中,企业的信息非常重要,每一次更新,都需要比较记录更新前后企业的信息,直接比较通常只能告诉我们它们是否指向同一个内存地址,那我们应该怎么办呢?分享 7 个方法给你!
|
3月前
|
C# UED SEO
C# 异步方法async / await任务超时处理
通过使用 `Task.WhenAny`和 `Task.Delay`方法,您可以在C#中有效地实现异步任务的超时处理机制。这种方法允许您在指定时间内等待任务完成,并在任务超时时采取适当的措施,如抛出异常或执行备用操作。希望本文提供的详细解释和代码示例能帮助您在实际项目中更好地处理异步任务超时问题,提升应用程序的可靠性和用户体验。
121 3
|
3月前
|
XML 数据格式 开发者
XML 命名空间
XML 命名空间
|
4月前
|
存储 C#
【C#】大批量判断文件是否存在的两种方法效率对比
【C#】大批量判断文件是否存在的两种方法效率对比
80 1
|
4月前
|
C#
C#的方法的参数传递
C#的方法的参数传递
45 0
|
2月前
|
存储 安全 编译器
学懂C#编程:属性(Property)的概念定义及使用详解
通过深入理解和使用C#的属性,可以编写更清晰、简洁和高效的代码,为开发高质量的应用程序奠定基础。
116 12
|
3月前
|
设计模式 C# 图形学
Unity 游戏引擎 C# 编程:一分钟浅谈
本文介绍了在 Unity 游戏开发中使用 C# 的基础知识和常见问题。从 `MonoBehavior` 类的基础用法,到变量和属性的管理,再到空引用异常、资源管理和性能优化等常见问题的解决方法。文章还探讨了单例模式、事件系统和数据持久化等高级话题,旨在帮助开发者避免常见错误,提升游戏开发效率。
117 4
|
3月前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
61 3
|
4月前
|
安全 C# 数据安全/隐私保护
实现C#编程文件夹加锁保护
【10月更文挑战第16天】本文介绍了两种用 C# 实现文件夹保护的方法:一是通过设置文件系统权限,阻止普通用户访问;二是使用加密技术,对文件夹中的文件进行加密,防止未授权访问。提供了示例代码和使用方法,适用于不同安全需求的场景。
233 0