将 Nokogiri XML 文档转换为字符串数组?
Convert Nokogiri XML Document into Array of Strings?
我正在 Rails 应用程序上创建 Ruby 并使用 Nokogiri 解析 XML 文件。我正在尝试将 XML 文件解析为可变字符串,我可以操纵这些字符串来创建其他内容。
这是一个示例XML我正在使用
<feed xmlns="http://www.w3.org/2005/Atom">
<entry>
<title type="html">
<![CDATA[ First Post! ]]>
</title>
<content type="html">
<![CDATA[
<p>I’m very excited to have finally got my site up and running along with this blog!</p>]]>
</content>
</entry>
</feed>
这是我迄今为止针对我的问题所做的工作
在我的控制器中 -
def index
@blog_title, @blog_post = parse_xml
end
private
def parse_xml
@xml_doc = Nokogiri::XML(open("atom.xml"))
titles = @xml_doc.css("entry title")
post = @xml_doc.css("content")
return titles, post
end
在我看来-
<% for i in 1..@blog_title.length %>
<li><%= @blog_title[i-1] %></li>
<li><%= @blog_post[i-1] %></li>
<% end %>
视图的示例输出(它 return 是一个 Nokogiri 元素)-
<title type="html"><![CDATA[First Post!]]></title>
理想情况下,我想将 Nokogiri::Document 中的所有 Nokogiri::Element 设为字符串,或者将整个数组设为字符串数组。
我试过遍历每个元素并调用 .to_s 但它似乎不起作用。
我也试过调用 Ruby::String 方法,例如 slice,但它不起作用(原因很明显)。
我试图获得的最终结果(使用我的视图中的示例输出)是 return 只有以下内容和其余的 none。
First Post!
谁能帮帮我?如果我不够清楚或者如果有人需要看到更多的工作,请随时询问!
对于您的情况,您应该简单地使用 .text
来提取标签的内容。 titles.text
之类的东西会起作用。
您正在处理可以包含多个 title
标签的 RSS/Atom 供稿。您需要遍历所有 title
个节点并分别提取它们的内容,以便您跟踪它们的顺序以及它们所附加的文章:
require 'nokogiri'
doc = Nokogiri::XML(<<EOT)
<feed xmlns="http://www.w3.org/2005/Atom">
<entry>
<title type="html">
<![CDATA[ First Post! ]]>
</title>
<content type="html">
<![CDATA[
<p>I’m very excited to have finally got my site up and running along with this blog!</p>]]>
</content>
</entry>
</feed>
EOT
doc.search('title').map(&:text)
# => ["\n First Post! \n "]
returns title
节点内的文本数组。从那里您可以轻松地清理每个字符串、操作它们、重复使用它们等等。
doc.search('title').map{ |s| s.text.strip }
# => ["First Post!"]
search
returns 一个节点集,类似于在文档中找到的 title
个节点的数组。如果你不遍历它们,你将得到一个包含所有文本的连接字符串,通常 NOT 你想要的:
require 'nokogiri'
doc = Nokogiri::XML(<<EOT)
<foo>
<title>this</title>
<title>is</title>
<title>what</title>
<title>you'd</title>
<title>get</title>
</foo>
EOT
doc.search('title').text
# => "thisiswhatyou'dget"
对比:
doc.search('title').map(&:text)
# => ["this", "is", "what", "you'd", "get"]
除非您事先了解文档的结构,否则尝试拆开第一个结果是不可能的,而这通常是不正确的。迭代返回的 NodeSet 将产生非常有用的结果。
为了与提要中的各种 title
标签保持一致,您需要遍历条目,然后提取嵌入的标题,这与您的示例 XML 和代码略有不同显示:
require 'nokogiri'
doc = Nokogiri::XML(<<EOT)
<feed xmlns="http://www.w3.org/2005/Atom">
<entry>
<title type="html">
<![CDATA[ First Post! ]]>
</title>
<content type="html">
<![CDATA[
<p>I’m very excited to have finally got my site up and running along with this blog!</p>]]>
</content>
</entry>
<entry>
<title type="html">
<![CDATA[ Second Post! ]]>
</title>
<content type="html">
<![CDATA[
<p>blah</p>]]>
</content>
</entry>
</feed>
EOT
titles = doc.search('entry').map { |entry|
entry.at('title').text.strip
}
titles # => ["First Post!", "Second Post!"]
或者更有用:
titles_and_content = doc.search('entry').map { |entry|
[
entry.at('title').text.strip,
entry.at('content').text.strip
]
}
titles_and_content
# => [["First Post!",
# "<p>I’m very excited to have finally got my site up and running along with this blog!</p>"],
# ["Second Post!", "<p>blah</p>"]]
其中 returns 每个条目的标题和内容。从这里您可以轻松地构建代码以提取文章链接、发布日期、refresh-rates、原始站点、您想要了解的有关单篇文章及其来源的所有信息,然后将其存储在数据库中以便稍后在需要时反流。
有可用于处理 RDF、RSS 和 Atom 提要的 gem 和脚本,但是,几年前,当我不得不为提要编写一个巨大的聚合器时,没有任何东西可以满足我的需要,所以我从头开始写了一个。我建议尝试找到一个而不是重新发明那个轮子,否则请查看他们的来源并从他们的经验中学习。在代码中有很多事情要做才能成为一个好的 network-citizen 不会淹没服务器并让你被禁止。
我正在 Rails 应用程序上创建 Ruby 并使用 Nokogiri 解析 XML 文件。我正在尝试将 XML 文件解析为可变字符串,我可以操纵这些字符串来创建其他内容。
这是一个示例XML我正在使用
<feed xmlns="http://www.w3.org/2005/Atom">
<entry>
<title type="html">
<![CDATA[ First Post! ]]>
</title>
<content type="html">
<![CDATA[
<p>I’m very excited to have finally got my site up and running along with this blog!</p>]]>
</content>
</entry>
</feed>
这是我迄今为止针对我的问题所做的工作
在我的控制器中 -
def index
@blog_title, @blog_post = parse_xml
end
private
def parse_xml
@xml_doc = Nokogiri::XML(open("atom.xml"))
titles = @xml_doc.css("entry title")
post = @xml_doc.css("content")
return titles, post
end
在我看来-
<% for i in 1..@blog_title.length %>
<li><%= @blog_title[i-1] %></li>
<li><%= @blog_post[i-1] %></li>
<% end %>
视图的示例输出(它 return 是一个 Nokogiri 元素)-
<title type="html"><![CDATA[First Post!]]></title>
理想情况下,我想将 Nokogiri::Document 中的所有 Nokogiri::Element 设为字符串,或者将整个数组设为字符串数组。
我试过遍历每个元素并调用 .to_s 但它似乎不起作用。
我也试过调用 Ruby::String 方法,例如 slice,但它不起作用(原因很明显)。
我试图获得的最终结果(使用我的视图中的示例输出)是 return 只有以下内容和其余的 none。
First Post!
谁能帮帮我?如果我不够清楚或者如果有人需要看到更多的工作,请随时询问!
对于您的情况,您应该简单地使用 .text
来提取标签的内容。 titles.text
之类的东西会起作用。
您正在处理可以包含多个 title
标签的 RSS/Atom 供稿。您需要遍历所有 title
个节点并分别提取它们的内容,以便您跟踪它们的顺序以及它们所附加的文章:
require 'nokogiri'
doc = Nokogiri::XML(<<EOT)
<feed xmlns="http://www.w3.org/2005/Atom">
<entry>
<title type="html">
<![CDATA[ First Post! ]]>
</title>
<content type="html">
<![CDATA[
<p>I’m very excited to have finally got my site up and running along with this blog!</p>]]>
</content>
</entry>
</feed>
EOT
doc.search('title').map(&:text)
# => ["\n First Post! \n "]
returns title
节点内的文本数组。从那里您可以轻松地清理每个字符串、操作它们、重复使用它们等等。
doc.search('title').map{ |s| s.text.strip }
# => ["First Post!"]
search
returns 一个节点集,类似于在文档中找到的 title
个节点的数组。如果你不遍历它们,你将得到一个包含所有文本的连接字符串,通常 NOT 你想要的:
require 'nokogiri'
doc = Nokogiri::XML(<<EOT)
<foo>
<title>this</title>
<title>is</title>
<title>what</title>
<title>you'd</title>
<title>get</title>
</foo>
EOT
doc.search('title').text
# => "thisiswhatyou'dget"
对比:
doc.search('title').map(&:text)
# => ["this", "is", "what", "you'd", "get"]
除非您事先了解文档的结构,否则尝试拆开第一个结果是不可能的,而这通常是不正确的。迭代返回的 NodeSet 将产生非常有用的结果。
为了与提要中的各种 title
标签保持一致,您需要遍历条目,然后提取嵌入的标题,这与您的示例 XML 和代码略有不同显示:
require 'nokogiri'
doc = Nokogiri::XML(<<EOT)
<feed xmlns="http://www.w3.org/2005/Atom">
<entry>
<title type="html">
<![CDATA[ First Post! ]]>
</title>
<content type="html">
<![CDATA[
<p>I’m very excited to have finally got my site up and running along with this blog!</p>]]>
</content>
</entry>
<entry>
<title type="html">
<![CDATA[ Second Post! ]]>
</title>
<content type="html">
<![CDATA[
<p>blah</p>]]>
</content>
</entry>
</feed>
EOT
titles = doc.search('entry').map { |entry|
entry.at('title').text.strip
}
titles # => ["First Post!", "Second Post!"]
或者更有用:
titles_and_content = doc.search('entry').map { |entry|
[
entry.at('title').text.strip,
entry.at('content').text.strip
]
}
titles_and_content
# => [["First Post!",
# "<p>I’m very excited to have finally got my site up and running along with this blog!</p>"],
# ["Second Post!", "<p>blah</p>"]]
其中 returns 每个条目的标题和内容。从这里您可以轻松地构建代码以提取文章链接、发布日期、refresh-rates、原始站点、您想要了解的有关单篇文章及其来源的所有信息,然后将其存储在数据库中以便稍后在需要时反流。
有可用于处理 RDF、RSS 和 Atom 提要的 gem 和脚本,但是,几年前,当我不得不为提要编写一个巨大的聚合器时,没有任何东西可以满足我的需要,所以我从头开始写了一个。我建议尝试找到一个而不是重新发明那个轮子,否则请查看他们的来源并从他们的经验中学习。在代码中有很多事情要做才能成为一个好的 network-citizen 不会淹没服务器并让你被禁止。