Hpricot ищет все теги в одном определенном пространстве имен - PullRequest
2 голосов
/ 27 августа 2011

Например, у меня есть следующий код:

<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 голосов
/ 02 сентября 2011

Похоже, что 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>}]>
...