Ruby 如何获取节点内容/文本中不属于子节点的部分

Ruby 如何获取节点内容/文本中不属于子节点的部分,ruby,xml,parsing,nodes,nokogiri,Ruby,Xml,Parsing,Nodes,Nokogiri,我有一个类似以下内容的XML: <foo>my dog <bar>has</bar> <bar>fleas</bar> he gave <bar>to me</bar></foo> 我如何才能以这样的方式获取此内容:“有跳蚤”,和“对我”是子节点的一部分,“我的狗”和“他给的”没有包装在子标签中,最好是按顺序 我假设必须有这样一种方式来查看内容/文本的各个部分,并且知道这是根,这是子,等等 Noko

我有一个类似以下内容的XML:

<foo>my dog <bar>has</bar> <bar>fleas</bar> he gave <bar>to me</bar></foo>
我如何才能以这样的方式获取此内容:
“有跳蚤”
,和
“对我”
是子节点的一部分,
“我的狗”
“他给的”
没有包装在子标签中,最好是按顺序


我假设必须有这样一种方式来查看内容/文本的各个部分,并且知道这是根,这是子,等等

Nokogiri的文档和许多关于堆栈溢出的关于Nokogiri的回答都涵盖了这一点

文件说:

内文⇒ 对象也称为:文本

获取包含的所有节点对象的内部文本

鉴于以下文件:

内容⇒ 对象(也是:#文本,#内部#文本)

返回此节点的内容

您可以看到这一点:

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和HTML中,它仍然是一个文本节点,因此在遍历
子节点时会显示出来,因为文本节点仍然是子节点。通常会使用一个更紧的选择器来避免它,但在这种情况下,并没有一个好的方法来做到这一点,因为正在检索的其他字符串也有额外的空格。我可能会这样做:

doc.at('foo').children.map { |node| node.text.strip } 
# => ["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.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"
doc.root#=>#
doc.root.name#=>“foo”

使用Nokogiri解析xml。它允许您从文件或字符串进行解析

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 "

我对您所处的环境了解不多,但如果您可以访问XPath,这就是
string(foo)
。函数的作用是:返回节点的字符串值,该值是其子代文本节点的连接。

请阅读“”以及链接页面和“”。你的问题问得不好。您给了我们一点XML,然后没有向我们展示您尝试过的任何内容:我们需要您的代码的最小示例,该示例显示了问题以及所需的输出。我不打算投票结束,但请在将来做这些事情,因为它们帮助我们帮助你,帮助其他人寻找类似的解决方案。
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"
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 "
xml_doc.xpath("//bar").map(&:text).join(' ')
=> "has fleas to me"