我有这个字符串
<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE en-note SYSTEM \"http://xml.evernote.com/pub/enml.dtd\">\n\n\n<en-note>\n<font size=\"5\">text_part_1</font><br><br>\n<font size=\"5\">text_part_2</font><br><br>\n<font size=\"5\">text_part_3</font>
我需要提取文本内容,但也要保留<br>
元素。所以结果将是
text_part_1<br><br>text_part_2<br><br>text_part_3
我如何使用Nokogiri来做这件事?
答案 0 :(得分:1)
部分问题是,您的XML是非法的。 <br>
未终止;它应该是<br/>
XML格式,或者有一个结束标记,即</br>
。
Nokogiri在尝试解析XML时会引发错误。如果在解析后检查errors
方法,您会看到类似的内容:
[
#<Nokogiri::XML::SyntaxError: Premature end of data in tag br line 7>,
#<Nokogiri::XML::SyntaxError: Premature end of data in tag br line 7>,
#<Nokogiri::XML::SyntaxError: Premature end of data in tag br line 6>,
#<Nokogiri::XML::SyntaxError: Premature end of data in tag br line 6>,
#<Nokogiri::XML::SyntaxError: Premature end of data in tag en-note line 5>
]
修复此问题,Nokogiri将能够正确处理XML。那时,你将能够做一些简单的事情:
require 'nokogiri'
doc = Nokogiri::XML(<<EOT)
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<!DOCTYPE en-note SYSTEM \"http://xml.evernote.com/pub/enml.dtd\">
<en-note>
<font size=\"5\">text_part_1</font><br/><br/>
<font size=\"5\">text_part_2</font><br/><br/>
<font size=\"5\">text_part_3</font>
EOT
doc.search('br').each do |br|
br.replace('##br##')
end
text = doc.content.gsub('##br##', '<br/>')
puts text
以下是带有更正的br
标记的输出:
text_part_1<br/><br/>
text_part_2<br/><br/>
text_part_3
修复XML的最简单方法是在解析之前运行一些清理代码,例如:
doc = Nokogiri::XML(xml.gsub('<br>', '<br/>'))
其中xml
是包含XML内容的变量。
答案 1 :(得分:0)
怎么样:
html = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE en-note SYSTEM \"http://xml.evernote.com/pub/enml.dtd\">\n\n\n<en-note>\n<font size=\"5\">text_part_1</font><br><br>\n<font size=\"5\">text_part_2</font><br><br>\n<font size=\"5\">text_part_3</font>"
doc = Nokogiri::HTML(html)
str = ""
doc.traverse { |n| str << n.to_s if (n.name == "text" or n.name == "br") }
str #=> "text_part_1<br><br>text_part_2<br><br>text_part_3"