读写XML文档时,去掉新增加节点的“空命名空间”(xmlns=””)
在做對ReprotViewer編程時,想做一個用戶可以更改顯示/打印列的功能,大致看了下,只需要通過對rdlc文件中改變其<Hidden>節(jié)點值為false/true,即可實現對應某列的顯示或隱藏。但是,如果在初始編輯和設計報表時,沒有設定列的隱藏,則<TableColumn>節(jié)點下,沒有<Visibility>節(jié)點,(<Hidden>節(jié)點又在<Visibility>節(jié)點下),所以在設置前必須增加判斷,如果沒有<Hidden>節(jié)點,必須先增加<Visibility>和<Hidden>節(jié)點。使用如下語句:
1: //創(chuàng)建<Visibility>節(jié)點 2: XmlElement xev = this.xdc.CreateElement("Visibility"); 3: //創(chuàng)建<Hidden>節(jié)點 4: XmlElement xeh = this.xdc.CreateElement("Hidden"); 5: //設置為顯示 6: xeh.InnerText = "false";?
然后,使用AppendChild方法將xeh添加到xev中,再將xev節(jié)點,添加到相應的<TableColumn>節(jié)點中。
?
但是,添加之后,發(fā)現仍然無法實現列的隱藏與顯示。查看代碼,每次編輯和更改之后,<Hidden>的值(InnerText),每次也都隨著更改為false或true。納悶中。
?
不過,后來發(fā)現,如果是通過VS初始設置為某列隱藏,則在以后的每次編輯和更改之后,<Hidden>的值也隨之更改,并且可以很好的實現列的隱藏與顯示。
?
對比兩種方法的不同
- 在VS中設計的結果: 1: <Visibility> 2: <Hidden>true</Hidden> 3: </Visibility>
- 手動添加的結果: 1: <Visibility xmlns=""> 2: <Hidden>true</Hidden> 3: </Visibility>
?
發(fā)現,通過手動添加的<Visibility>節(jié)點,其命名空間為 xmlns = “”.最初的想法,是去掉此空命名空間,在網上發(fā)現也有不少人碰到這個問題,但是都沒有解決,直到看到這篇文章【http://blog.tianya.cn/blogger/post_show.asp?BlogID=2524806&PostID=21711977&idWriter=7649736&Key=746436846#Bottom】
才恍然大悟。
1): 當我們在AppendChild的時候,如果ParentNode是帶有xmlns屬性的,而你新加的節(jié)點,在創(chuàng)建時不指定xmlns或指定為空時,子節(jié)點將出現xmlns="" 屬性,終無法去掉。 2): 當父節(jié)點具有xmlns屬性時,子節(jié)點必須指定xmlns屬性,但是當子節(jié)點的xmlns屬性與父節(jié)點命名空間相同時,子節(jié)點不顯示xmlns屬性。 總結:上面問題的根本所在就是我們理解上的錯誤,我們認為沒有為子節(jié)點指定命名空間,就不應該出現此屬性,恰恰相反,當我們?yōu)槠渲付ㄅc父節(jié)點相同的命名空間時,此屬性才不會出現。?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路徑搜索節(jié)點 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: //創(chuàng)建<Visibility>節(jié)點 2: XmlElement xev = this.xdc.CreateElement("Visibility",this.xdc.DocumentElement.NamespaceURI); 3: //創(chuàng)建<Hidden>節(jié)點 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=””)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 博客园客户端UAP开发随笔 -- 适配不
- 下一篇: 解析网上的XML文件