在做对ReprotViewer编程时,想做一个用户可以更改显示/打印列的功能,大致看了下,只需要通过对rdlc文件中改变其<Hidden>节点值为false/true,即可实现对应某列的显示或隐藏。但是,如果在初始编辑和设计报表时,没有设定列的隐藏,则<TableColumn>节点下,没有<Visibility>节点,(<Hidden>节点又在<Visibility>节点下),所以在设置前必须增加判断,如果没有<Hidden>节点,必须先增加<Visibility>和<Hidden>节点。使用如下语句:

   1: //创建<Visibility>节点
   2: XmlElement xev = this.xdc.CreateElement("Visibility");
   3: //创建<Hidden>节点
   4: XmlElement xeh = this.xdc.CreateElement("Hidden");
   5: //设置为显示
   6: xeh.InnerText = "false";

然后,使用AppendChild方法将xeh添加到xev中,再将xev节点,添加到相应的<TableColumn>节点中。

但是,添加之后,发现仍然无法实现列的隐藏与显示。查看代码,每次编辑和更改之后,<Hidden>的值(InnerText),每次也都随着更改为false或true。纳闷中。

不过,后来发现,如果是通过VS初始设置为某列隐藏,则在以后的每次编辑和更改之后,<Hidden>的值也随之更改,并且可以很好的实现列的隐藏与显示。

对比两种方法的不同

  • 在VS中设计的结果:

       1: <Visibility>
       2:   <Hidden>true</Hidden>
       3: </Visibility>
  • 手动添加的结果:
       1: <Visibility xmlns="">
       2:   <Hidden>true</Hidden>
       3: </Visibility>

发现,通过手动添加的<Visibility>节点,其命名空间为 xmlns = “”.最初的想法,是去掉此空命名空间,在网上发现也有不少人碰到这个问题,但是都没有解决,直到看到这篇文章【http://blog.tianya.cn/blogger/post_show.asp?BlogID=2524806&PostID=21711977&idWriter=7649736&Key=746436846#Bottom

才恍然大悟。

1): 当我们在AppendChild的时候,如果ParentNode是带有xmlns属性的,而你新加的节点,在创建时不指定xmlns或指定为空时,子节点将出现xmlns="" 属性,终无法去掉。 
2): 当父节点具有xmlns属性时,子节点必须指定xmlns属性,但是当子节点的xmlns属性与父节点命名空间相同时,子节点不显示xmlns属性。
总结:上面问题的根本所在就是我们理解上的错误,我们认为没有为子节点指定命名空间,就不应该出现此属性,恰恰相反,当我们为其指定与父节点相同的命名空间时,此属性才不会出现。 

Demo:

            XmlDocument doc = new XmlDocument();
doc.AppendChild(doc.CreateXmlDeclaration("1.0", null, null));
doc.AppendChild(doc.CreateElement( "", "aaa", "URI"));
doc.LastChild.AppendChild(doc.CreateElement("bb", ""));
doc.LastChild.AppendChild(doc.CreateElement("cc",null));
doc.LastChild.AppendChild(doc.CreateElement("bb", "URI"));
doc.Save("c:\\keccTmp0.xml");

KeccTmp0.xml

<?xml version="1.0"?>
<aaa xmlns="URI">
<bb xmlns="" />
<cc xmlns="" />
<bb />
</aaa>

一:由于我在使用XmlDocument操作rdlc文件时,为了便于搜索,定义了其中的命名空间

   1: //增加命名空间,以用于使用xPath路径搜索节点
   2: AddNamespace("C", "http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition");
   3: AddNamespace("rd", "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner");

二:所以,在新建<Visibility>时,必须继承此XmlDocument文档命名空间。

   1: //创建<Visibility>节点
   2: XmlElement xev = this.xdc.CreateElement("Visibility",this.xdc.DocumentElement.NamespaceURI);
   3: //创建<Hidden>节点
   4: XmlElement xeh = this.xdc.CreateElement("Hidden",this.xdc.DocumentElement.NamespaceURI);
   5: //设置为显示
   6: xeh.InnerText = "false";

这样,修改后的rdlc文件,与使用VS报表编辑器设计出来的结果就一致了,也可以很好的实现列的显示与隐藏。

总结:一直对Xml编程接触不多,用的也非常少,对于命名空间这样基本的知识与属性都不完全了解,惭愧呀。

---------------------------------------------

作者:Ritchie(乞戈) 
出处:http://RitchieChen.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

出处:http://www.cnblogs.com/RitchieChen/archive/2010/07/21/1782266.html

读写XML文档时,去掉新增加节点的“空命名空间”(xmlns=””)的更多相关文章

  1. C#操作Xml:通过XmlDocument读写Xml文档

    什么是Xml? Xml是扩展标记语言的简写,是一种开发的文本格式.关于它的更多情况可以通过w3组织了解http://www.w3.org/TR/1998/REC-xml-19980210.如果你不知道 ...

  2. dom4j读写XML文档

    dom4j 最常用最简单的用法(转) 要使用dom4j读写XML文档,需要先下载dom4j包,dom4j官方网站在 http://www.dom4j.org/目前最新dom4j包下载地址:http:/ ...

  3. python+selenium自动化软件测试(第12章):Python读写XML文档

    XML 即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进 行定义的源语言.xml 有如下特征: 首先,它是有标签对组成:<aa></aa> ...

  4. 通过XmlDocument读写Xml文档参考地址

    /// <summary> /// 获取一个报表的参数 http://blog.csdn.net/hdhai9451/article/details/12170069 /// </s ...

  5. 显示XML文档时排序数据

    先看XML文档: 也可拷贝下面代码另存为XMl文档: <stepList> <steps> <step> <order>1</order> ...

  6. WebService生成XML文档时出错。不应是类型XXXX。使用XmlInclude或SoapInclude属性静态指定非已知的类型。

    情况是SingleRoom和DoubleRoom是Room类的子类.在WebService中有一个方法是返回Room类. public Room Get(int roomId) { return Ro ...

  7. 生成 XML 文档时出错。

    找来找去,在CSDN 里看到高手解答了. 原来 WebService 传递参数时,不能使用 DataTable 如果需要使用DataTable  那就要用 DataSet  包装起来. 如果担心数据太 ...

  8. 文档对象模型操作xml文档

    简介 :文档对象模型(DOM)是一种用于处理xml文档的API函数集. 2.1文档对象模型概述 按照W3C的定义,DOM是“一种允许程序或脚本动态地访问更新文档内容,结构和样式的.独立于平台和语言的规 ...

  9. Java高级特性 第13节 解析XML文档(1) - DOM和XPath技术

    一.使用DOM解析XML文档 DOM的全称是Document Object Model,也即文档对象模型.在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树 ...

随机推荐

  1. devilbox(三):在docker中启动带密码的redis数据库

    背景概述: 之前是使用docker搭建了一套集成的开发环境devilbox,也说了这个环境可以自定义.其实搭建这个环境一是为了练习docker使用,二是搭建我们测试环境,主要用到各种数据库,然而安装教 ...

  2. _beginthreadex()和CreateThread()的区别

    在本例子中我们使用——beginThreadex这个函数,它和createThread的区别是: 为了方便管理,我么在使用该函数的时候可以把它的线程函数作为类成员,这也就需要在类中把该函数变成静态函数 ...

  3. OC 内存管理之手动内存管理MRC

    一.基本原理 1.什么是内存管理 内存管理的重要性: 移动设备的内存极其有限,每个app所能占用的内存是有限制的 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间. ...

  4. jstl <fmt:formatNumber>标签

    标签用于格式化数字,百分比和货币. 如果type属性为百分比或数字,则可以使用多个数字格式属性.maxIntegerDigits和minIntegerDigits属性允许您指定数字的非分数部分的大小. ...

  5. python3 scrapy 爬取腾讯招聘

    安装scrapy不再赘述, 在控制台中输入scrapy startproject tencent 创建爬虫项目名字为 tencent 接着cd tencent 用pycharm打开tencent项目 ...

  6. L1-012 计算指数

    真的没骗你,这道才是简单题 —— 对任意给定的不超过 10 的正整数 n,要求你输出 2​n​​.不难吧? 输入格式: 输入在一行中给出一个不超过 10 的正整数 n. 输出格式: 在一行中按照格式  ...

  7. 在junit中添加fail--有test失败即build Failed

    项目使用jenkins做持续集成,ant来构建,发现在跑junit单元测试的时候,如果有test case失败了,ci的状态是黄色的unstable,而不是红色的failed,看起来很不爽.个人觉得b ...

  8. ORM与hibernate概述

    JDBC是什么? JDBC代表java数据库连接,并提供一组java API,用于java成许访问关系数据库.这些Java的API允许Java程序执行SQL语句,并与任何SQL兼容的数据库进行交互. ...

  9. 子域名爆破&C段查询&调用Bing查询同IP网站

    在线子域名爆破 <?php function domainfuzz($domain) { $ip = gethostbyname($domain); preg_match("/\d+\ ...

  10. windows开机自动登录

     控制台输入control userpasswords2 ,去掉下图中的√,输入登陆所用用户名密码即可.