zoukankan      html  css  js  c++  java
  • 多命名空间的 Xml 文档解析

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

    下文是对C#对XML的具体操作

    如何完成.Net下XML文档的读写操作

    C#操作xml SelectNodes,SelectSingleNode总是返回NULL 与 xPath 介绍

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

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

    XML文件如下:

     1 <?xml version="1.0" encoding="utf-8" ?>
     2 <Enginuity:ViewControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     3                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     4                        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     5                        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     6                        xmlns:Enginuity="clr-namespace:Enginuity.Core;assembly=Enginuity.Core" >
     7   <Viewbox Stretch="Fill">
     8     <TextBox Name="Text_10" Value="abc"/>
     9     <TextBox Name="Text_11" Value="bcd"/>
    10   </Viewbox>
    11 </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	est.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	est.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多命名空间,

    作者:Work Hard Work Smart
    出处:http://www.cnblogs.com/linlf03/
    欢迎任何形式的转载,未经作者同意,请保留此段声明!
  • 相关阅读:
    GTK+ 3.6.2 发布,小的 bug 修复版本
    RunJS 新增 Echo Ajax 测试功能
    Mozilla 发布 Popcorn Maker,在线创作视频
    Sina微博OAuth2框架解密
    Mina状态机State Machine
    Mozilla 发布 Shumway —— 纯JS的SWF解析器
    Code Browser 4.5 发布,代码浏览器
    ROSA 2012 "Enterprise Linux Server" 发布
    ltrace 0.7.0 发布,程序调试工具
    Artifactory 2.6.5 发布,Maven 扩展工具
  • 原文地址:https://www.cnblogs.com/xakml/p/3601665.html
Copyright © 2011-2022 走看看