我正在解析从各种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”。
我获取该节点的选项是“标题”,“标题”还是“标题”?
谢谢!
答案 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)和/或Nokogiri(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>