如何处理Nokogiri的XPath表达式中的转义字符

时间:2009-09-05 23:14:10

标签: xml ruby xpath nokogiri

我正在使用带有xml文档的nokogiri,看起来像这样:

<songs>
  <song>
    <artist>Juana Molina</artist>
    <album>Un Dia</album>
    <track>8</track>
    <title>Dar (Qu&#233; Dif&#237;cil)</title>
    <rating>5</rating>
    <filename>\Juana Molina\Un Dia\08 - Juana Molina - Dar (Qu&#233; Dif&#237;cil).mp3</filename>
  </song>
<songs>

当我尝试查找包含转义字符的歌曲时,我不会使用以下xpath查询得到任何回复(无论我是否执行或不转义查询中使用的文件名字符串)

file = File.new("songs.xml")
parser = Nokogiri::XML(file)

filename = "\Juana Molina\Un Dia\08 - Juana Molina - Dar (Qué Difícil).mp3"

xm = Builder::XmlMarkup.new
filename = xm.text! filename
# => \Juana Molina\Un Dia\08 - Juana Molina - Dar (Qu&#233; Dif&#237;cil).mp3

nodes = parser.root.xpath('//songs/song[filename="'+filename+'"]')
puts nodes

在xpath查询中表示转义字符的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

MRI版本1.8.x很难使用Unicode,但我们的想法应该是先取消你的字符串。

require 'cgi'

unscaped_str = CGI.unescapeHTML(File.read('songs.xml'))

我还认为您需要使用-KU运行irb或ruby以强制MRI使用unicode。

希望这有帮助。