0

我有这个字符串

<?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 来做到这一点?

4

2 回答 2

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 内容的变量在哪里。

于 2012-09-17T06:39:57.093 回答
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"
于 2012-09-16T23:21:33.557 回答