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

在做对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

posted on   jack_Meng  阅读(3316)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示

喜欢请打赏

扫描二维码打赏

支付宝打赏

主题色彩