2011-05-02 124 views
1

我使用Ruby 1.8.7作为项目。如何使用Nokogiri在XML中添加节点属性?

我需要能够为它解析和修改一部分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

请添加到您的XML示例,显示从根节点到您的目标节点。我们并不需要所有的东西,只是看到了这条道路和可疑的XMLNS。 – 2011-05-02 02:31:10

+0

我在用'''node'添加元素属性时出现问题'''] ='''''''''''node.set_attribute('','')似乎正在工作更好,但还没有得到它在我的irb控制台之外实际工作。 – JackChance 2016-03-02 21:46:47

回答

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>