【问题标题】:XmlDocument ignore xmlnsXmlDocument 忽略 xmlns
【发布时间】:2012-02-20 09:28:42
【问题描述】:

我有一个 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 声明谈到了 http://www.w3.org/1999/xhtml,但您描述的错误谈到了 http://www.w3.org/2000/xmlns - 您确定它们都是正确的吗?
  • 是的,我的第三方 XHTML 有 1999 和异常说 2000。
  • 更重要的是“xhtml”与“xmlns”位...
  • 是的,但它不起作用。当您尝试以任何方式触摸此节点时,您总是会遇到异常。但是对于所有其他节点来说一切都很好。您仍然可以通过 XPath 获取任何内部节点(就像我一样)。如何解决?
  • 好的,我刚刚重现了这个问题——如果你去掉“Namespaces = false”行,它就会消失。你为什么这样做?

标签: c# xml-namespaces xmldocument


【解决方案1】:

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

【讨论】:

  • 谢谢你,nonnb。我已经使用 ((XmlElement)xmln).RemoveAttribute("xmlns"); 摆脱了命名空间属性
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多