RubyでXHTMLなどのXMLを処理していて、ある要素を文字列として取得したいと思ったときのサンプルです。
# coding: utf-8
require 'rexml/document'
doc = REXML::Document.new(DATA)
elem = doc.elements['//body/div']
# textは、その要素の子要素のうち、最初のテキスト要素を文字列として返します。
p elem.text
# => "\n "
# textsは、その要素の子要素のうち、テキスト要素を文字列の配列として返します。
p elem.texts
# => ["\n ", "\n ", "\n"]
# to_sは、自身をXML文字列として返します。よくouterXMLと呼ばれる挙動です。
p elem.to_s
# => "<div>\n <h1>テストページ</h1>\n <div>\n こんにちは<strong>世界</strong>。\n </div>\n</div>"
# innerXMLが欲しいときは、このように子要素すべてのto_sを呼べばOKです。
p elem.map(&:to_s).join
# => "\n <h1>テストページ</h1>\n <div>\n こんにちは<strong>世界</strong>。\n </div>\n"
# XMLタグを取り除いた文字列だけを取得するときは、このようにXPathを使うのが簡単です。
class REXML::Element
def inner_text
REXML::XPath.match(self,'.//text()').join
end
end
p elem.inner_text
# => "\n テストページ\n \n こんにちは世界。\n \n"
__END__
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>TEST PAGE</title>
</head>
<body>
<div>
<h1>テストページ</h1>
<div>
こんにちは<strong>世界</strong>。
</div>
</div>
</body>
</html>