2017-03-09 3 views
0

私はこのようなものに見えるXML持っている:私は<foo>ノードのcontentまたはinner_textをしたい場合はサブノードの一部ではないノードのコンテンツ/テキストの一部を取得する方法

<foo>my dog <bar>has</bar> <bar>fleas</bar> he gave <bar>to me</bar></foo> 

を彼ら戻る:

my dog has fleas he gave to me 
私は "has fleas"、および "to me"サブノードの一部、および "my dog "" he gave "あるような方法でこのコンテンツを取得することができますが、サブタグで囲まれていない方法

、好ましくは順番に?

コンテンツ/テキストの部分を見て、これがルートであることを知っている必要があります、これはサブなどですか?

+0

"[ask]"とリンク先ページ、 "[mcve]"をお読みください。あなたの質問はうまくいきません。あなたは私たちに少しXMLを与えて、あなたが試したことは何も表示しません:あなたは、問題を目的の出力と共に示す最小限のコード例が必要です。私は閉会には投票しませんが、私たちがあなたを助け、同様の解決策を探している他の人を助けるために、将来的にこれらのことをしてください。 –

答えて

0

これはNokogiriのドキュメントとStack OfflowのNokogiriについての多くの回答の両方でカバーされています。

NodeSetドキュメントは言う:

inner_text⇒オブジェクトは、別名:テキスト

Nodeのドキュメントが言うのに対し、すべて含まれているノードの内部テキストが

オブジェクト取得:

コンテンツ⇒オブジェクト(#text、#inner_text)

このノードの内容を返します。

あなたはこの動作を確認することができます

require 'nokogiri' 

doc = Nokogiri::XML(<<EOT) 
<foo>my dog <bar>has</bar> <bar>fleas</bar> he gave <bar>to me</bar></foo> 
EOT 

doc.at('foo').text # => "my dog has fleas he gave to me" 
doc.at('foo').children.map(&:text) # => ["my dog ", "has", " ", "fleas", " he gave ", "to me"] 

は、空の文字列" "に注意してください。私たち人間はXMLで、そのことは何も考えると、それはまだテキストノードなのでchildrenを歩くときに現れるHTMLたい一方でそれは、テキストノードいるので、

</bar> <bar> 

の間のスペースの結果であり、まだ子供です。通常、これを避けるためにはより厳密なセレクタが使用されますが、この場合、他の文字列にも余分なスペースがあるため、これを行う良い方法はありません。

doc.at('foo').children.map { |node| node.text.strip } 
# => ["my dog", "has", "", "fleas", "he gave", "to me"] 

か:次に

doc.at('foo').children.map { |node| node.text.strip }.reject { |node| node.empty? } 
# => ["my dog", "has", "fleas", "he gave", "to me"] 

join(' ')結果を使用して:

doc.at('foo').children.map { |node| node.text.strip }.join(' ') 
# => "my dog has fleas he gave to me" 

か:限り

doc.at('foo').children.map { |node| node.text.strip }.reject { |node| node.empty? }.join(' ') 
# => "my dog has fleas he gave to me" 

私はおそらく代わりに、このような何かをしたいですが何であるかを知っている:

doc.root # => #<Nokogiri::XML::Element:0x3fecdc8a2434 name="foo" children=[#<Nokogiri::XML::Text:0x3fecdc8a7984 "my dog ">, #<Nokogiri::XML::Element:0x3fecdc8a795c name="bar" children=[#<Nokogiri::XML::Text:0x3fecdc8a72a4 "has">]>, #<Nokogiri::XML::Text:0x3fecdc8a7934 " ">, #<Nokogiri::XML::Element:0x3fecdc8a790c name="bar" children=[#<Nokogiri::XML::Text:0x3fecdc8a6e94 "fleas">]>, #<Nokogiri::XML::Text:0x3fecdc8a78e4 " he gave ">, #<Nokogiri::XML::Element:0x3fecdc8a78bc name="bar" children=[#<Nokogiri::XML::Text:0x3fecdc8a6a84 "to me">]>]> 
doc.root.name # => "foo" 
0

xmlを解析するためにノコギリを使用します。ファイルや文字列から解析することができます。

xml_doc.xpath("//bar").map(&:text).join(' ') 
=> "has fleas to me" 
0

は、私はあなたが作業している環境についてあまり知りませんが、あなたは、XPathへのアクセス権を持っている場合、これは単純です:あなたは、他のフォーマットを使用する場合は

xml_doc = Nokogiri::XML("<foo>my dog <bar>has</bar> <bar>fleas</bar> he gave <bar>to me</bar></foo>") 

#to get text for <bar> elements 
xml_doc.xpath("//bar").text() 
=> "hasfleasto me" 

#to get text for parent element <foo> 
xml_doc.xpath('//foo/text()').text() 
=> "my dog he gave " 

、配列を扱いますstring(foo)。 string()関数は、子孫テキストノードの連結であるノードの文字列値を返します。

関連する問題