Hpricot搜索一个特定命名空间下的所有标签

时间:2011-08-27 13:48:11

标签: parsing xhtml jruby xml-namespaces hpricot

例如,我有以下代码:

<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  <title><io:content part="title" /></title>
  <link rel="icon" href="/document/7e9f29e2-cdee-4f85-ba25-132fa867aa90/latest" type="image/x-icon" />
  <n1:content description="Standard CSS" uuid="d069071c-3534-4945-9fb6-2d7be35a165e" />
  <n1:term>Content Development</n1:term>
</head>

这个XHTML片段并不严格合法,因为之前没有声明名称空间,所以我不能使用Nokogiri,它有更好的命名空间支持。

我想进行一次搜索,找到节点<n1:content><n1:term>以及'n1'命名空间下的所有标签。

如何实现?谢谢!

1 个答案:

答案 0 :(得分:0)

看起来Hpricot不能完全处理名称空间。

无论前缀如何,您都可以选择是否知道该元素:

doc.search("title")
=> #<Hpricot::Elements[{elem <title> {emptyelem <io:content part="title">} </title>}]>

......但这不是你问的。

这是我的黑客解决方法:首先使用正则表达式查找所有名称空间元素,然后使用Hpricot搜索那些:

elems = doc.to_s.scan(/<\s*(n1:\w+)/).uniq.join("|")
=> "n1:content|n1:term"
doc.search(elems)
=> #<Hpricot::Elements[{emptyelem <n1:content description="Standard CSS" uuid="d069071c-3534-4945-9fb6-2d7be35a165e">}, {elem <n1:term> "Content Development" </n1:term>}]>