使用 nokogiri 将节点标记为文本

Node tag as text with nokogiri

我有以下 XML:

<DaysOfWeek>
    <MondayToSunday/>
</DaysOfWeek>

我正在使用 Nokogiri,如果我调用 node.name 它 returns "text"。如何获取标签的实际名称,例如 "MondayToSunday"?

您的元素已经存在,标签名称为 MondayToSunday。问题是当 Nokogiri 解析文档时也包含空行,在您的情况下您需要将其过滤掉。

这是一个例子:

# ex.rb

require 'nokogiri'

xml = <<-XML
<DaysOfWeek>
    <MondayToSunday/>
</DaysOfWeek>
XML

days_of_week = Nokogiri::XML(xml).children

days_of_week.children.each do |el|
  puts "Name: #{el.name}"
  p el.text
end

然后,当我们运行这个例子时,我们可以看到我们实际上有三个children用于DaysOfWeek标签:

Name: text
"\n    "
Name: MondayToSunday
""
Name: text
"\n"

其中有两个名为 text 的地方有新行,并且在标签 MondayToSunday.

之间

我们无法判断您是如何使用 Nokogiri 的,所以这可能是一个简单的错误操作。这是我要做的:

require 'nokogiri'

xml =<<EOT
<DaysOfWeek>
    <MondayToSunday/>
</DaysOfWeek>
EOT

doc = Nokogiri::XML.parse(xml)
doc.at('DaysOfWeek').name # => "DaysOfWeek"
doc.at('MondayToSunday').name # => "MondayToSunday"

at 是找到第一个与特定访问器匹配的节点的快速方法,在本例中是名为“DaysOfWeek”或“MondayToSunday”的节点。 Nokogiri 有 chock-full 种隔离特定标签的方法,这是它的强项;找到它,获取有关它的信息,然后移动到下一个并重复。

这些都在常规文档和 cheat sheet 中。