0

I have this string

<?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>

I need to extract the text content, but also keep the <br> elements. So the result would be

text_part_1<br><br>text_part_2<br><br>text_part_3

How can I use Nokogiri to do this?

4

2 に答える 2

1

問題の一部は、XML が違法であることです。<br>終了していません。XML にするか<br/>、終了タグ ( </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 に答える