Как я могу извлечь эти подстроки? - PullRequest
0 голосов
/ 16 июня 2011

В Ruby 1.9.2 и Rails 3.0.1 у меня есть эта строка:

  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">
  <en-note><div>this is new note content</div>
  <div></div>
  <div></div>
  <div><br clear="none"/><en-media width="640" height="480" style="cursor: url('/images/magnify.cur'),crosshair;" hash="6d7b2488610acd5d1269cb466567dcc6" type="image/jpeg"></en-media></div>
  <div></div>
  <div>some more text</div>
  <div></div>
  <div></div><br/><en-media hash="da3ad4553701959b5c5620fb609af9c4" type="image/jpeg"/></en-note>

В строке есть два тега en-media, каждый из которых имеет атрибут hash.

У меня также есть массив значений хеш-функции. Мне нужно использовать эти хэш-значения для замены соответствующих тегов en-media.

Например, первый элемент в массиве - "6d7b2488610acd5d1269cb466567dcc6". Мне нужно использовать это значение, чтобы заменить эту подстроку из строки:

<en-media width="640" height="480" style="cursor: url('/images/magnify.cur'),crosshair;" hash="6d7b2488610acd5d1269cb466567dcc6" type="image/jpeg"></en-media>

Как я могу это сделать?

Я пытался использовать Нокогири следующим образом:

string.xpath("//*[@*[hash]]")

Но я получаю такой результат:

--- !ruby/object:Nokogiri::XML::NodeSet 
document: !ruby/object:Nokogiri::HTML::Document 
  decorators: 
  errors: 
  - !ruby/exception:Nokogiri::XML::SyntaxError 
    message: Tag en-note invalid
    code: 801
    column: 9
    domain: 5
    file: 
    int1: 0
    level: 2
    line: 3
    str1: en-note
    str2: 
    str3: 
  - !ruby/exception:Nokogiri::XML::SyntaxError 
    message: Tag en-media invalid
    code: 801
    column: 170
    domain: 5
    file: 
    int1: 0
    level: 2
    line: 6
    str1: en-media
    str2: 
    str3: 
  - !ruby/exception:Nokogiri::XML::SyntaxError 
    message: Tag en-media invalid
    code: 801
    column: 84
    domain: 5
    file: 
    int1: 0
    level: 2
    line: 10
    str1: en-media
    str2: 
    str3: 
  node_cache: 
  - !ruby/object:Nokogiri::XML::Element {}

  - !ruby/object:Nokogiri::XML::Element {}

1 Ответ

0 голосов
/ 16 июня 2011

Чтобы получить хеш-атрибуты, вы пробовали string.xpath("en-note//en-media//@hash")?Возможно, вы хотите изменить XML следующим образом:

string.xpath("en-note//en-media//@hash").each_with_index do |attribute, index|
  attribute.value = values[index]
end
...