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