如何在Nokogiri中将所有XML标记设为小写?

时间:2015-03-04 14:59:13

标签: ruby xml nokogiri

我正在解析从各种Feed中获得的一些XML。显然,一些XML偶尔会有一个大写的标签。我想将XML规范化为所有小写标签,以便更容易进行搜索等。

我想做的是:

parsed = Nokogiri::XML.parse(xml_content)
node = parsed.css("title")  # => should return a Nokogiri node for the title tag

但是,某些XML文档对该标记有“TITLE”。

我获取该节点的选项是“标题”,“标题”还是“标题”?

谢谢!

2 个答案:

答案 0 :(得分:2)

如果您希望通过小写和所有标记名称转换xml文档,可以采用以下方法:

parsed = Nokogiri::XML.parse(xml_content)
parsed.traverse do |node|
  node.name = node.name.downcase if node.kind_of?(Nokogiri::XML::Element)
end

答案 1 :(得分:0)

作为一种通用方法,您可以将所有元素(标记)名称转换为小写(例如,通过使用XSLT或其他解决方案),然后仅使用小写来执行所有XPath / CSS查询。

This XSLT solution should work;然而,我的Ruby版本(2.0.0p481)和/或Nok​​ogiri(1.5.6)神秘地抱怨(也许是关于" lower-case(...)"功能的使用?也许Nokogiri没有'是否支持XSLT v2?)

这是一个似乎有效的解决方案:

require 'nokogiri'

xslt = Nokogiri::XSLT(File.read('lower.xslt'))
# <?xml version="1.0" encoding="UTF-8"?>
# <xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
#   <xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz'" />
#   <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
#   <xsl:template match="*">
#     <xsl:element name="{translate(local-name(), $uppercase, $lowercase)}">
#       <xsl:apply-templates />
#     </xsl:element>
#   </xsl:template>
# </xsl:transform>

doc  = Nokogiri::XML(File.read('doc.xml'))
# <?xml version="1.0" encoding="UTF-8"?>
# <FOO>
#  <BAR>Bar</BAR>
#  <GAH>Gah</GAH>
#  <ZIP><DOO><DAH/></DOO></ZIP>
# </FOO>

puts xslt.transform(doc)
# <?xml version="1.0"?>
# <foo>
#   <bar>Bar</bar>
#   <gah>Gah</gah>
#   <zip><doo><dah/></doo></zip>
# </foo>