2017-09-29 67 views
1

我有如下所示的xml文件。我想解析它转换为 红宝石散列。我试图这样做:使用Nokogiri将xml转换为散列,但保留锚定标记

但它去掉锚标记,我结束了 与描述这样的事情。 “今天是”

如何将XML转换为散列,但保留锚标签?

代码:

@doc   = File.open(xml_file) { |f| Nokogiri::XML(f) } 
data   = Hash.from_xml(@doc.to_s) 

XML文件

<blah> 
    <tag> 
    <name>My Name</name> 
    <url>www.url.com</url> 
    <file>myfile.zip</file> 
    <description>Today is a <a href="www.sunny.com">sunny</a></description> 
</tag> 
    <tag> 
    <name>Someones Name</name> 
    <url>www.url2.com</url> 
    <file>myfile2.zip</file> 
    <description>Today is a <a href="www.rainy.com">rainy</a></description> 
</tag> 
</blah> 
+0

为什么你需要Nokogiri在这里?为什么不'Hash.from_xml(File.open(xml_file).read)'? – chumakoff

+0

但是不会去掉锚标签吗?有没有办法保持锚标签? – user3771782

回答

1

我现在看到的唯一方法是在整个文档中逃脱里面<description> HTML,然后执行Hash#from_xml

doc = File.open(xml_file) { |f| Nokogiri::XML(f) } 

# escape HTML inside <description> 
doc.css("description").each do |node| 
    node.inner_html = CGI.escapeHTML(node.inner_html) 
end 

data = Hash.from_xml(doc.to_s) # => 

# {"blah"=> 
# { 
#  "tag"=>[ 
#  { 
#   "name"=>"My Name", 
#   "url"=>"www.url.com", 
#   "file"=>"myfile.zip", 
#   "description"=>"Today is a <a href=\"www.sunny.com\">sunny</a>" 
#  }, 
#  { 
#   "name"=>"Someones Name", 
#   "url"=>"www.url2.com", 
#   "file"=>"myfile2.zip", 
#   "description"=>"Today is a <a href=\"www.rainy.com\">rainy</a>" 
#  } 
#  ] 
# } 
# } 

Nokogiri在这里仅用于HTML转义。如果你找到另一种逃避方式,你并不需要它。例如:

xml = File.open(xml_file).read 

# escaping inner HTML (maybe not the best way, just example) 
xml.gsub!(/<description>(.*)<\/description>/, "<description>#{CGI.escapeHTML($1)}</description>") 

data = Hash.from_xml(doc.to_s) 
+0

谢谢!这工作:) – user3771782

+0

@ user3771782你为什么不接受答案? – chumakoff

相关问题