XmlDocument ignore xmlns

本文关键字:xmlns ignore XmlDocument | 更新日期: 2023-09-27 18:21:31

我有一个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");

XmlDocument ignore xmlns

猜测,您试图解析的页面最近已更改为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()一起使用,但要小心包含大量元素的文档——这可能会变得非常缓慢。