XmlDocument 忽略 xmlns

Den*_*nis 5 c# xmldocument xml-namespaces

我有以以下开头的 XHTML 文件:

<html xmlns="http://www.w3.org/1999/xhtml">
Run Code Online (Sandbox Code Playgroud)

我加载它:

XmlDocument xml = new XmlDocument();
StringReader sr = new StringReader(html);
XmlTextReader xmltr = new XmlTextReader(sr);
xmltr.Namespaces = false;
xml.Load(xmltr);
Run Code Online (Sandbox Code Playgroud)

当我打电话时,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");
Run Code Online (Sandbox Code Playgroud)

Stu*_*tLC 6

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

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

你可以

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

 xml.SelectSingleNode("/*[local-name()='html']/*[local-name()='body']")
Run Code Online (Sandbox Code Playgroud)

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

*您还可以使用 // ,local-name()但要小心包含大量元素的文档 - 这可能会变得非常慢。

  • 谢谢你,nonnb。我已经使用 `((XmlElement)xmln).RemoveAttribute("xmlns");` 摆脱了命名空间属性 (2认同)