Ruby 是否在节点中获取特定标记?

Ruby 是否在节点中获取特定标记?,ruby,xml,xpath,nokogiri,Ruby,Xml,Xpath,Nokogiri,我正在使用Ruby、XPath和Nokogiri,并试图从以下XML中检索d1: <a> <b1> <c> <d1>01/11/2001</d1> <d2>02/02/2004</d2> </c> </b1> </a> 它不返回任何内容(无错误) 我想在中获取文本您不需要在xpath查询中请求文本内容: rs = doc.xpa

我正在使用Ruby、XPath和Nokogiri,并试图从以下XML中检索
d1

<a>
  <b1>
    <c>
      <d1>01/11/2001</d1>
      <d2>02/02/2004</d2>
    </c>
  </b1>
</a>
它不返回任何内容(无错误)


我想在

中获取文本您不需要在xpath查询中请求文本内容:

rs = doc.xpath('//a/b1/c/d1/text()')

您不会在xpath查询中要求文本内容:

rs = doc.xpath('//a/b1/c/d1/text()')
您误用了XPath:

require 'nokogiri'

doc = Nokogiri::XML(<<EOT)
<a>
  <b1>
    <c>
      <d1>01/11/2001</d1>
      <d2>02/02/2004</d2>
    </c>
  </b1>
</a>
EOT

doc.at('/a/b1/c/d1').text # => "01/11/2001"
doc.at('//d1').text # => "01/11/2001"
看下面几行。我没有使用XPath选择器,而是使用了CSS,它更易于阅读。Nokogiri支持这两种观点

doc.at('d1').text # => "01/11/2001"
doc.at('a b1 c d1').text # => "01/11/2001"
另外,请注意从这两行返回的数据类型:

doc.at('/a/b1/c/d1/text()').class # => Nokogiri::XML::Text
doc.at('/a/b1/c/d1').text.class # => String
<> p>虽然告诉解析器在代码< >代码>内查找“代码>文本())/代码>节点,返回的不是文本,并且需要进一步访问以使其可用,所以请考虑放弃使用“代码>文本())<代码>,除非您确切地知道为什么需要它:

doc.at('/a/b1/c/d1/text()').text # => "01/11/2001"
最后,Nokogiri有许多用于定位节点的方法。如上所述,
xpath
返回节点集,
at
返回节点
xpath
实际上是Nokogiri的
search
方法的一个特定于xpath的版本
search
css
xpath
都返回节点集
at
at_css
at_xpath
所有返回节点。当您有一个不明确的选择器需要专门用作CSS或XPath时,CSS和XPath变体非常有用。大多数情况下,Nokogiri可以自己判断它是CSS还是XPath,并且会做正确的事情,因此在大多数编码中使用通用的
search
at
。当必须指定其中一个时,请使用特定版本。

您误用了XPath:

require 'nokogiri'

doc = Nokogiri::XML(<<EOT)
<a>
  <b1>
    <c>
      <d1>01/11/2001</d1>
      <d2>02/02/2004</d2>
    </c>
  </b1>
</a>
EOT

doc.at('/a/b1/c/d1').text # => "01/11/2001"
doc.at('//d1').text # => "01/11/2001"
看下面几行。我没有使用XPath选择器,而是使用了CSS,它更易于阅读。Nokogiri支持这两种观点

doc.at('d1').text # => "01/11/2001"
doc.at('a b1 c d1').text # => "01/11/2001"
另外,请注意从这两行返回的数据类型:

doc.at('/a/b1/c/d1/text()').class # => Nokogiri::XML::Text
doc.at('/a/b1/c/d1').text.class # => String
<> p>虽然告诉解析器在代码< >代码>内查找“代码>文本())/代码>节点,返回的不是文本,并且需要进一步访问以使其可用,所以请考虑放弃使用“代码>文本())<代码>,除非您确切地知道为什么需要它:

doc.at('/a/b1/c/d1/text()').text # => "01/11/2001"

最后,Nokogiri有许多用于定位节点的方法。如上所述,
xpath
返回节点集,
at
返回节点
xpath
实际上是Nokogiri的
search
方法的一个特定于xpath的版本
search
css
xpath
都返回节点集
at
at_css
at_xpath
所有返回节点。当您有一个不明确的选择器需要专门用作CSS或XPath时,CSS和XPath变体非常有用。大多数情况下,Nokogiri可以自己判断它是CSS还是XPath,并且会做正确的事情,因此在大多数编码中使用通用的
search
at
。当您必须指定一个或另一个时,请使用特定版本。

您的问题是什么?在节点中获取特定标记?如何读取文档您的问题是什么?在节点中获取特定标记?如何读取文档
text()
不返回文本。它返回一个Nokogiri::XML::Text节点:
doc.xpath(“//a/b1/c/d1/Text()”)#=>[#]
。要获取内部文本,您仍然必须使用访问器,如
text
doc.xpath('//a/b1/c/d1/text()).text
To_s
doc.xpath('//a/b1/c/d1/text())。To_s=>“01/11/2001”
。另外,
xpath
返回一个节点集,因此理论上会返回一个节点数组,这不是OP想要的。您不应该在根节点上使用
/
text()
不返回文本。它返回一个Nokogiri::XML::Text节点:
doc.xpath(“//a/b1/c/d1/Text()”)#=>[#]
。要获取内部文本,您仍然必须使用访问器,如
text
doc.xpath('//a/b1/c/d1/text()).text
To_s
doc.xpath('//a/b1/c/d1/text())。To_s=>“01/11/2001”
。另外,
xpath
返回一个节点集,因此理论上会返回一个节点数组,这不是OP想要的。您不应该在根节点上使用
/