如何使用Nokogiri在XML中添加节点属性?

时间:2011-05-02 01:21:14

标签: ruby xml nokogiri

我正在使用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 个答案:

答案 0 :(得分:1)

我看到的一件事可能在您的代码中出错,或者可能是因为您的示例不够好,您是在XPath中使用XML命名空间,但标签本身没有命名空间。

此示例代码显示您处于正确的轨道上。我认为您的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>