2017-03-09 2 views
0

I는 다음과 같이 보이는 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

링크 된 페이지 및 "[mcve]"와 함께 "[ask]"를 읽으십시오. 귀하의 질문에 잘 대답하지 않습니다. 당신은 우리에게 약간의 XML을 주었고 우리가 시도한 것을 우리에게 보여주지 않았다 : 우리는 원하는 출력과 함께 문제를 보여주는 최소한의 코드 예제가 필요하다. 나는 투표를하지 않겠지 만, 장래에 그러한 일을하십시오. 왜냐하면 우리가 당신을 도우며 다른 사람들이 비슷한 해결책을 찾도록 도울 수 있기 때문입니다. –

답변

0

이것은 Nokogiri의 문서와 Stack Overflow에 대한 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"] 

공지 빈 문자열 " ". 즉

</bar> <bar> 

우리 인간은 XML에 해당되는 아무것도 생각하고 그것은 여전히 ​​텍스트 노드의 HTML 좋아하지만

사이의 공간의 결과이므로, children을 통해 걸을 때 그것은 텍스트 노드부터 나타 아직 아이입니다. 일반적으로 더 엄격한 선택기를 사용하면 피할 수 있지만이 경우 검색하는 다른 문자열에도 불필요한 공백이 있기 때문에이 방법을 사용할 수 없습니다.아마이 대신 같은 것을 할 것 :

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? }.join(' ') 
# => "my dog has fleas he gave to me" 

:

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? } 
# => ["my dog", "has", "fleas", "he gave", "to me"] 

을 다음에 join(' ') 결과를 사용하여 무엇이인지 아는 것:

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() 함수는 자손 텍스트 노드의 연결 인 노드의 문자열 값을 반환합니다.