XmlDocument忽略xmlns

时间:2012-01-27 11:15:42

标签: c# xml-namespaces xmldocument

我有XHTML文件,它以:

开头
<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/'.异常,无法访问我的XmlDocument的内部xml。如何在加载期间摆脱xmlns?

解决方案是:

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

1 个答案:

答案 0 :(得分:2)

猜测,您尝试解析的页面最近已更改为XHTML,因此命名空间?

根据@JonSkeet,你不应该在你的XmlTextReader上设置xmltr.Namespaces = false;

你可以

  • 拥抱名称空间并使用XmlNameSpaceManager来管理XHTML(xmlns="http://www.w3.org/1999/xhtml")名称空间。
  • 使用名称空间不可知xpath,例如local-name(),它将忽略命名空间:*

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

无论哪种方式,您的代码都需要更改以适应命名空间,除非您在加载之前将命名空间从XML中删除。

*您也可以将//与local-name()一起使用,但要注意包含大量元素的文档 - 这可能会变得非常慢。