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/
    欢迎任何形式的转载,未经作者同意,请保留此段声明!
  • 相关阅读:
    Oracle SQL 函数
    j2me MIDP2.0 下实现split函数
    Linux Oracle 增量恢复时错误 ORA19573: 无法获得 exclusive 入队 (数据文件 5 的)
    Linux Oracle10 建立归档模式的详细过程
    j2me MIDP2.0 下实现的图片缩放函数
    linux下oracle10g建立归档模式 接连出现错误:ORA19905 ORA01078 LRM00109
    j2me下 触摸屏的开发 NetBeans 模拟器支持触摸屏
    高级程序员:你不可不知的20条编程经验(转载)
    生成规定大小的图片(缩略图生成)
    asp.net简单实现用button做按钮图片
  • 原文地址:https://www.cnblogs.com/xakml/p/3601665.html
Copyright © 2011-2022 走看看