如何在 Nokogiri 中将所有 XML 标签设为小写?
How can I make all XML tags lowercase in Nokogiri?
我正在解析从各种提要中获得的一些 XML。显然,某些 XML 偶尔会有一个全大写的标签。我想将 XML 规范化为所有小写标签,以便于搜索等。
我想做的是:
parsed = Nokogiri::XML.parse(xml_content)
node = parsed.css("title") # => should return a Nokogiri node for the title tag
但是,某些 XML 文档中有 "TITLE" 个标签。
无论它的标签是 "title"、"TITLE" 还是 "Title",我有什么选择来获取该节点?
谢谢!
如果您想通过小写所有标签名称来转换 xml 文档,可以采用以下一种方法:
parsed = Nokogiri::XML.parse(xml_content)
parsed.traverse do |node|
node.name = node.name.downcase if node.kind_of?(Nokogiri::XML::Element)
end
作为一般方法,您可以将所有元素(标记)名称转换为小写(例如,通过使用 XSLT 或其他解决方案),然后仅使用小写执行所有 XPath/CSS 查询。
This XSLT solution should work;然而,我的 Ruby (2.0.0p481) and/or 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>
我正在解析从各种提要中获得的一些 XML。显然,某些 XML 偶尔会有一个全大写的标签。我想将 XML 规范化为所有小写标签,以便于搜索等。
我想做的是:
parsed = Nokogiri::XML.parse(xml_content)
node = parsed.css("title") # => should return a Nokogiri node for the title tag
但是,某些 XML 文档中有 "TITLE" 个标签。
无论它的标签是 "title"、"TITLE" 还是 "Title",我有什么选择来获取该节点?
谢谢!
如果您想通过小写所有标签名称来转换 xml 文档,可以采用以下一种方法:
parsed = Nokogiri::XML.parse(xml_content)
parsed.traverse do |node|
node.name = node.name.downcase if node.kind_of?(Nokogiri::XML::Element)
end
作为一般方法,您可以将所有元素(标记)名称转换为小写(例如,通过使用 XSLT 或其他解决方案),然后仅使用小写执行所有 XPath/CSS 查询。
This XSLT solution should work;然而,我的 Ruby (2.0.0p481) and/or 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>