读写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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
读写XML文档时,去掉新增加节点的“空命名空间”(xmlns=””)的更多相关文章
- C#操作Xml:通过XmlDocument读写Xml文档
什么是Xml? Xml是扩展标记语言的简写,是一种开发的文本格式.关于它的更多情况可以通过w3组织了解http://www.w3.org/TR/1998/REC-xml-19980210.如果你不知道 ...
- dom4j读写XML文档
dom4j 最常用最简单的用法(转) 要使用dom4j读写XML文档,需要先下载dom4j包,dom4j官方网站在 http://www.dom4j.org/目前最新dom4j包下载地址:http:/ ...
- python+selenium自动化软件测试(第12章):Python读写XML文档
XML 即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进 行定义的源语言.xml 有如下特征: 首先,它是有标签对组成:<aa></aa> ...
- 通过XmlDocument读写Xml文档参考地址
/// <summary> /// 获取一个报表的参数 http://blog.csdn.net/hdhai9451/article/details/12170069 /// </s ...
- 显示XML文档时排序数据
先看XML文档: 也可拷贝下面代码另存为XMl文档: <stepList> <steps> <step> <order>1</order> ...
- WebService生成XML文档时出错。不应是类型XXXX。使用XmlInclude或SoapInclude属性静态指定非已知的类型。
情况是SingleRoom和DoubleRoom是Room类的子类.在WebService中有一个方法是返回Room类. public Room Get(int roomId) { return Ro ...
- 生成 XML 文档时出错。
找来找去,在CSDN 里看到高手解答了. 原来 WebService 传递参数时,不能使用 DataTable 如果需要使用DataTable 那就要用 DataSet 包装起来. 如果担心数据太 ...
- 文档对象模型操作xml文档
简介 :文档对象模型(DOM)是一种用于处理xml文档的API函数集. 2.1文档对象模型概述 按照W3C的定义,DOM是“一种允许程序或脚本动态地访问更新文档内容,结构和样式的.独立于平台和语言的规 ...
- Java高级特性 第13节 解析XML文档(1) - DOM和XPath技术
一.使用DOM解析XML文档 DOM的全称是Document Object Model,也即文档对象模型.在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树 ...
随机推荐
- Confluence 6 为 Active Directory 配置一个 SSL 连接预要求
希望生成证书,你需要安装下面的组件在你希望连接的 Windows Domain Controller 上. Internet Information Services (IIS) 在你安装 Windo ...
- Oracle11g温习-第八章:归档日志
2013年4月27日 星期六 10:36 1.归档和非归档的区别 1) 归档会在日志切换时,备份历史日志,用于OLTP(在线事务处理系统),可以进行冷备份和热备份,可以实现数据库完全恢复.不完全恢复 ...
- Leetcode 784
//这代码可真丑陋,但我学到了两点1:char和string可以无缝互相转换2:char可以直接加减数字进行转换string不行 class Solution { public: vector< ...
- Microsoft Word 2007 向程序发送命令时出现问题解决方法
最近在打开Word文档时总是出现“向程序发送命令时出现问题”对话框,而且不确定性,关闭重新打开有时没事了有时还不行, 很让人头疼,经过尝试,把问题解决了 1.问题截图如下: 2.解决方法 1)方法一: ...
- linux processes identifiers
Linux, like all Unix uses user and group identifiers to check for access rights to files and images ...
- 离线部署 Cloudera Manager 5 和 CDH 5.12.1 及使用 CDH 部署 Hadoop 集群服务
Cloudera Manager Cloudera Manager 分为两个部分:CDH和CM. CDH是Cloudera Distribution Hadoop的简称,顾名思义,就是cloudera ...
- (C/C++学习笔记) 十. 函数
十. 函数 ● 基本概念 函数 函数定义 function definition: return_type function_name ( parameter list ) { Body of fun ...
- 2.2 C++类的成员变量和成员函数
参考:http://www.weixueyuan.net/view/6334.html 总结: 类成员的声明和定义: 类成员函数的定义分类内定义(内联)和类外定义(可用 inline 关键字 强制转换 ...
- SharePoint 2010 Ribbon with wrong style in Chrome and Safari
When we add custom ribbon to SharePoint 2010, it may display well in IE but not in Chrome and Safari ...
- PowerShell基础
1. 一些命令像Get-SPSite有不同的参数变量.这些变量通过-?展示出来. Get-SPSite -? 2. F3 在当前行显示最近的一条命令结果 3. F7 显示之前执行过的命令列表 4. 显 ...