【发布时间】:2008-10-08 15:29:34
【问题描述】:
我有一个项目,我在其中使用一些特别丑陋的“实时”HTML,并使用 HTML Agility Pack 将其强制转换为正式的 XML DOM。然后我想要做的是使用 Linq to XML 查询这个,以便我可以刮出我需要的位。我正在使用here 描述的方法将 HtmlDocument 解析为 XDocument,但是在尝试对此进行查询时,我不确定如何处理命名空间。在一个特定的文档中,原始 HTML 实际上是带有以下标记的格式不佳的 XHTML:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
当试图从这个文档中查询时,似乎命名空间属性阻止了我做类似的事情:
var x = xDoc.Descendants("div");
// returns null
显然,对于那些“div”标签,只有 LocalName 是“div”,但正确的标签名称是命名空间加上“div”。我曾尝试对 XML 命名空间的问题进行一些研究,似乎可以通过这种方式查询绕过命名空间:
var x =
(from x in xDoc.Descendants()
where x.Name.LocalName == "div"
select x);
// works
但是,这似乎是一个相当老套的解决方案,并不能正确解决命名空间问题。据我了解,一个正确的 XML 文档可以包含多个名称空间,因此处理它的正确方法应该是解析出我正在查询的名称空间。有没有其他人不得不这样做?我只是让它变得复杂吗?我知道我可以通过坚持使用 HtmlDocument 并使用 XPath 查询来避免这一切,但如果可能的话,我宁愿坚持我所知道的(Linq),我也更愿意知道我没有为进一步的命名空间做准备——未来的相关问题。
在这种情况下处理命名空间的正确方法是什么?
【问题讨论】:
标签: html xml linq namespaces linq-to-xml