2012-01-27 68 views
3

我有XHTML文件,該文件開頭:的XmlDocument忽略的xmlns

<html xmlns="http://www.w3.org/1999/xhtml"> 

我加載它:

XmlDocument xml = new XmlDocument(); 
StringReader sr = new StringReader(html); 
XmlTextReader xmltr = new XmlTextReader(sr); 
xmltr.Namespaces = false; 
xml.Load(xmltr); 

當我打電話xml.InnerXml我總是得到The 'xmlns' attribute is bound to the reserved namespace 'http://www.w3.org/2000/xmlns/'.異常,無法訪問的內部XML我XmlDocument的。如何在加載過程中擺脫xmlns?

的解決方案是:

XmlNode xmln = xml.SelectSingleNode("//html"); 
if (xmln != null) 
    ((XmlElement)xmln).RemoveAttribute("xmlns"); 
+0

您的XHTML聲明會討論'http:// www.w3.org/1999/xhtml',但您描述的錯誤是關於'http:// www.w3.org/2000/xmlns'的討論 - 您是肯定他們都是正確的? – 2012-01-27 11:24:04

+0

是的,我的第三方XHTML有1999年,異常說2000年。 – Denis 2012-01-27 11:34:58

+0

更重要的是「xhtml」和「xmlns」位... – 2012-01-27 11:36:25

回答

2

在猜測,您試圖解析最近已改爲XHTML,因此命名空間的頁面?

按照@JonSkeet,你不應該在你的XmlTextReader

您可以

  • 懷抱命名空間設置xmltr.Namespaces = false;和使用XmlNameSpaceManager管理XHTML(xmlns="http://www.w3.org/1999/xhtml")命名空間。
  • 使用命名空間不可知xpathlocal-name(),這將忽略命名空間:*

xml.SelectSingleNode("/*[local-name()='html']/*[local-name()='body']") 

無論哪種方式,您的代碼將需要改變,以適應命名空間,除非你破解在加載之前從XML中刪除名稱空間。

*您也可以使用//與local-name(),但要注意包含大量元素的文檔 - 這可能會變得非常緩慢。

+1

謝謝你,nonnb。我已經使用'((XmlElement)xmln)去掉名稱空間屬性.RemoveAttribute(「xmlns」);' – Denis 2012-01-27 14:50:00