Как добавить атрибут узла в XML с помощью Nokogiri? - PullRequest
1 голос
/ 02 мая 2011

Я использую Ruby 1.8.7 для проекта.

Мне нужно иметь возможность анализировать и изменять биты XML-кода для него, и я столкнулся с несколькими проблемами.Я использую Nokogiri для анализа.

У меня есть строка:

<linking-phrase-appearance id="1JDLZ0609-JFP4ZP-TH" x="346" y="207" width="39" height="14"/>

Мне нужно изменить ее на:

<linking-phrase-appearance id="1JDLZ0609-JFP4ZP-TH" x="346" y="207" width="39" height="14" font-color="255 0 0 255"/>

У меня есть код, который находитправильные строки для изменения, но когда я изменяю это, ничего не записывается в выходной файл.

Это код, который я использую для изменения атрибута:

# middle_node = id of line that needs to be changed (is unique to the line)
appearance = @xml.xpath("/xmlns:cmap/xmlns:map/xmlns:linking-phrase-appearance-list")
   appearance.each do |node|
      if node['id'] == middle_node
         node['font-color'] = '255,0,0,255'
       end
   end 

Я предполагаю, что естькакая-то причина, почему это не работает, но я не уверен, почему.

1 Ответ

1 голос
/ 02 мая 2011

Я вижу одну вещь, которая может быть неправильной в вашем коде, или может быть потому, что ваши примеры не достаточно хороши, это то, что вы используете пространство имен XML в вашем XPath, но сам тег не имеет пространства имен.

Этот пример кода показывает, что вы на правильном пути. Я думаю, что ваш XPath неверен, но без большего количества XML-документа я не могу знать наверняка:

require "nokogiri"

xml = '<xml><linking-phrase-appearance id="1JDLZ0609-JFP4ZP-TH" x="346" y="207" width="39" height="14"/></xml>'

target_id = '1JDLZ0609-JFP4ZP-TH'

doc = Nokogiri::XML(xml)
doc.search(%Q{//linking-phrase-appearance[@id="#{ target_id }"]}).each do |n|
  n['font-color'] = '255,0,0,255'
end
puts doc.to_xml

>> <?xml version="1.0"?>
>> <xml>
>>   <linking-phrase-appearance id="1JDLZ0609-JFP4ZP-TH" x="346" y="207" width="39" height="14" font-color="255,0,0,255"/>
>> </xml>
...