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

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

 今晚在博问看到一个问题:查找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/,如需转载请自行联系原作者

相关文章
|
29天前
|
人工智能
歌词结构的巧妙安排:写歌词的方法与技巧解析,妙笔生词AI智能写歌词软件
歌词创作是一门艺术,关键在于巧妙的结构安排。开头需迅速吸引听众,主体部分要坚实且富有逻辑,结尾则应留下深刻印象。《妙笔生词智能写歌词软件》提供多种 AI 功能,帮助创作者找到灵感,优化歌词结构,写出打动人心的作品。
|
1月前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
42 3
|
30天前
|
人工智能
写歌词的技巧和方法全解析:开启你的音乐创作之旅,妙笔生词智能写歌词软件
怀揣音乐梦想,渴望用歌词抒发情感?掌握关键技巧,你也能踏上创作之旅。灵感来自生活点滴,主题明确,语言简洁,韵律和谐。借助“妙笔生词智能写歌词软件”,AI辅助创作,轻松写出动人歌词,实现音乐梦想。
|
15天前
|
JSON PHP 数据格式
PHP解析配置文件的常用方法
INI文件是最常见的配置文件格式之一。
|
15天前
|
Java Maven
maven项目的pom.xml文件常用标签使用介绍
第四届人文,智慧教育与服务管理国际学术会议(HWESM 2025) 2025 4th International Conference on Humanities, Wisdom Education and Service Management
71 8
|
13天前
|
JSON 程序员 C#
使用 C# 比较两个对象是否相等的7个方法总结
比较对象是编程中的一项基本技能,在实际业务中经常碰到,比如在ERP系统中,企业的信息非常重要,每一次更新,都需要比较记录更新前后企业的信息,直接比较通常只能告诉我们它们是否指向同一个内存地址,那我们应该怎么办呢?分享 7 个方法给你!
|
16天前
|
C# UED SEO
C# 异步方法async / await任务超时处理
通过使用 `Task.WhenAny`和 `Task.Delay`方法,您可以在C#中有效地实现异步任务的超时处理机制。这种方法允许您在指定时间内等待任务完成,并在任务超时时采取适当的措施,如抛出异常或执行备用操作。希望本文提供的详细解释和代码示例能帮助您在实际项目中更好地处理异步任务超时问题,提升应用程序的可靠性和用户体验。
43 3
|
22天前
|
机器学习/深度学习 人工智能 安全
TPAMI:安全强化学习方法、理论与应用综述,慕工大、同济、伯克利等深度解析
【10月更文挑战第27天】强化学习(RL)在实际应用中展现出巨大潜力,但其安全性问题日益凸显。为此,安全强化学习(SRL)应运而生。近日,来自慕尼黑工业大学、同济大学和加州大学伯克利分校的研究人员在《IEEE模式分析与机器智能汇刊》上发表了一篇综述论文,系统介绍了SRL的方法、理论和应用。SRL主要面临安全性定义模糊、探索与利用平衡以及鲁棒性与可靠性等挑战。研究人员提出了基于约束、基于风险和基于监督学习等多种方法来应对这些挑战。
44 2
|
30天前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
18 1
|
21天前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
30 3
下一篇
无影云桌面