在做对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. python-day71--django多表操作

    表关系: 1 一对多 2 多对多 3 一对一 添加记录: 一对多:书与出版社 #创建一对多: publish=models.ForeignKey("Publish") 注意:pub ...

  2. zzuli 1484 继续双线

    1484: 探 寻 宝 藏 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 94  Solved: 52 SubmitStatusWeb Board De ...

  3. UVA-1663 Purifying Machine (最大匹配数)

    题目大意:每一个01串中最多含有一个‘*’,‘*’既可表示0也可表示1,给出一些等长的这样的01串,问最少能用多少个这样的串表示出这些串.如:000.010.0*1表示000.010.001.011, ...

  4. office每次打开都要重新配置

    office每次打开都要重新配置     1● 找到路径 C:\Program Files\Common Files\microsoft shared\OFFICE14\Office Setup Co ...

  5. linux processes identifiers

    Linux, like all Unix uses user and group identifiers to check for access rights to files and images ...

  6. Openwrt TF Card Auto Mount&Check (4)

    1      Scope of Document This document describes tf card bootup auto do file system check when mount ...

  7. tensorflow 模型保存后的加载路径问题

    import tensorflow as tf #保存模型 saver = tf.train.Saver() saver.save(sess, "e://code//python//test ...

  8. IBM、HPUX、Solaris不同之处

  9. SharePoint 2013的100个新功能之内容管理(一)

    一:拖拽 现在在任意的文档库中,你可以拖拽文档到文档库区域,它会以进度条显示上传到文档库中.第一步鼠标点击文档拖动到文档库区域时,它会变成"拖到此处",第二步放开鼠标,上传. 二: ...

  10. 2019.1.5 China’s population

    China’s population is expected to hit a peak of 1.44 billion in 2029, and start to experience negati ...