2015-10-06 67 views
1

TextMate片段(.tmSnippet)通常看起来像这样,而一些键/字符串对是可选的,可以在任何位置。解析Nokogiri的TextMate片段

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
     <key>content</key> 
     <string>${1:the actual snippet}</string> 
     <key>tabTrigger</key> 
     <string>my_trigger</string> 
     <key>name</key> 
     <string>This is my Snippet's name</string> 
     <key>scope</key> 
     <string>source.js</string> 
     <key>uuid</key> 
     <string>6C2985F1-9BB8-43D7-A85C-1006B2932A0D</string> 
</dict> 
</plist> 

我试图分析此使用引入nokogiri,但由于标签都是<key><string>和每个键/串线对可以改变的立场,我不知道该怎么做。我在scopetabTrigger,contentname之后。

+0

我没有任何东西可以添加到接受的答案中,但是您是否知道有解析Apple's PropertyList格式的Gem? [bleything/plist](https://github.com/bleything/plist):通用属性列表操作库 –

回答

1

假设dict节点的子节点只是key - string双,这样的:

require 'nokogiri' 

kws = %w{ scope tabTrigger content name } 

doc = Nokogiri::XML(File.read('a.tmsnippet')) 

doc.xpath('//dict').each do | dict_node | 
    dict_node.element_children.map(&:content).each_slice(2) do | k, v | 
    next unless kws.include? k 
    puts "#{k} -> #{v}" 
    end 
end 

产生

"content -> ${1:the actual snippet} 
tabTrigger -> my_trigger 
name -> This is my Snippet's name 
scope -> source.js" 

否则,你需要对节点类型多一些逻辑看着前他们的内容。