例如,我有以下代码:
<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'命名空间下的所有标签。
如何实现?谢谢!
答案 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>}]>