Ruby中使用Nokogiri包来操作XML格式数据的科目,R

2019-06-01 18:37 来源:未知

三.还是能直接从网站获得:

你可能感兴趣的小说:

  • Ruby中应用Nokogiri包来操作XML格式数据的科目
  • Ruby中XML格式数据管理库REXML的采纳办法指南
  • 实例分析Ruby程序中调用REXML来深入分析XML格式数据的用法
  • Ruby使用REXML库来深入分析xml格式数据的主意
  • Ruby程序中创设和平解决析XML文件的章程
  • 在Ruby中处理XML和XSLT以及X帕特h的简要教程

一、基础语法 1.一向以字符串方式获得nokogiri对象: html_doc = Nokogiri::HTML("htmlbodyh1Mr. Be...

读取URL:

三、Namespaces 对于有多少个标签的景况,命名空间就起到分外大的成效了.
诸如有这么2个parts.xml文件:

Ruby的XML格式数据分析库Nokogiri的利用进阶,rubynokogiri


壹、基础语法
一.间接以字符串方式得到nokogiri对象:

html_doc = Nokogiri::HTML("<html><body><h1>Mr. Belvedere Fan Club</h1></body></html>")
xml_doc = Nokogiri::XML("<root><aliens><alien><name>Alf</name></alien></aliens></root>")

这里的html_doc和xml_doc就是nokogiri文件

二.也得以经过文件句柄获取nokogiri对象:

f = File.open("blossom.xml")
doc = Nokogiri::XML(f)
f.close

三.还是可以直接从网址获得:

require 'open-uri'
doc = Nokogiri::HTML(open("http://www.xxx.com/"))

二、XML文件解析实例 从XML/HTML文件里抓取字段的常用方法:

今昔有贰个名称为shows.xml的公文,内容如下:

<root>
 <sitcoms>
  <sitcom>
   <name>Married with Children</name>
   <characters>
    <character>Al Bundy</character>
    <character>Bud Bundy</character>
    <character>Marcy Darcy</character>
   </characters>
  </sitcom>
  <sitcom>
   <name>Perfect Strangers</name>
   <characters>
    <character>Larry Appleton</character>
    <character>Balki Bartokomous</character>
   </characters>
  </sitcom>
 </sitcoms>
 <dramas>
  <drama>
   <name>The A-Team</name>
   <characters>
    <character>John "Hannibal" Smith</character>
    <character>Templeton "Face" Peck</character>
    <character>"B.A." Baracus</character>
    <character>"Howling Mad" Murdock</character>
   </characters>
  </drama>
 </dramas>
</root>

假若想把持有character标签的内容搜索出来,能够那样管理:

@doc = Nokogiri::XML(File.open("shows.xml"))
@doc.xpath("//character")

xpath和css方法,再次回到的是3个结点列表,类似于三个数组,它的从头到尾的经过正是从文件中搜索出来的适合相配规则的结点.

把dramas结点里的character结点列表查出来:

@doc.xpath("//dramas//character")

更有可读性的css方法:

characters = @doc.css("sitcoms name")
# => ["<name>Married with Children</name>", "<name>Perfect Strangers</name>"]

当已知查询结果惟一时,借使想一向再次来到那一个结果,而不是列表,能够平素利用at_xpath或at_css:

@doc.css("dramas name").first # => "<name>The A-Team</name>"
@doc.at_css("dramas name")  # => "<name>The A-Team</name>"

三、Namespaces 对此有多少个标签的事态,命名空间就起到那多少个大的成效了.
举例有这么三个parts.xml文件:

<parts>
 <!-- Alice's Auto Parts Store -->
 <inventory xmlns="http://alicesautoparts.com/">
  <tire>all weather</tire>
  <tire>studded</tire>
  <tire>extra wide</tire>
 </inventory>

 <!-- Bob's Bike Shop -->
 <inventory xmlns="http://bobsbikes.com/">
  <tire>street</tire>
  <tire>mountain</tire>
 </inventory>
</parts>

能够使用唯一的URubiconL作为namespaces,以分别区别的tires标签:

@doc = Nokogiri::XML(File.read("parts.xml"))
car_tires = @doc.xpath('//car:tire', 'car' => 'http://alicesautoparts.com/')
bike_tires = @doc.xpath('//bike:tire', 'bike' => 'http://bobsbikes.com/')

为了让namespace的施用更有利于,nokogiri会自动绑定在根结点上找到的适当的别样namespace.
nokogiri会自动关联提供的ULANDL,那么些惯例能够削减代码量.
举例有那样二个atom.xml文件:

<feed xmlns="http://www.w3.org/2005/Atom">

 <title>Example Feed</title>
 <link href="http://example.org/"/>
 <updated>2003-12-13T18:30:02Z</updated>
 <author>
  <name>John Doe</name>
 </author>
 <id>urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6</id>

 <entry>
  <title>Atom-Powered Robots Run Amok</title>
  <link href="http://example.org/2003/12/13/atom03"/>
  <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
  <updated>2003-12-13T18:30:02Z</updated>
  <summary>Some text.</summary>
 </entry>
</feed>

遵照上边提到的老办法,xmlns已被机关绑定,不用再手动为xmlns赋值:

@doc.xpath('//xmlns:title')
# => ["<title>Example Feed</title>", "<title>Atom-Powered Robots Run Amok</title>"]

平等境况,css的用法:

@doc.css('xmlns|title')

与此同不经常候在运用css格局时,假使namespaces名字是xmlns,那么连这么些词自个儿都得以忽略掉:

@doc.css('title')

可选项 nokogiri提供了一部分解析文件时的可选项,常用的有:

能够选择唯一的UXC60L作为namespaces,以分别不相同的tires标签:

$ gem install nokogiri

还要在选择css格局时,假如namespaces名字是xmlns,那么连这么些词自个儿都得以忽略掉:

xpath:

您大概感兴趣的篇章:

  • Ruby中行使Nokogiri包来操作XML格式数据的课程
  • Ruby中XML格式数据管理库REXML的使用格局指南
  • 实例剖判Ruby程序中调用REXML来剖判XML格式数据的用法
  • Ruby使用REXML库来深入分析xml格式数据的办法
  • Ruby程序中创设和解析XML文件的秘诀
  • 在Ruby中拍卖XML和XSLT以及XPath的粗略教程

修改节点内容

当已知查询结果唯不经常,假如想直接再次回到那个结果,而不是列表,能够一贯利用at_xpath或at_css:

title = @doc.css("book title").firsto
title.content = 'new title'
puts @doc.to_html

# =>
...
 <title>new title</title>
...
@doc = Nokogiri::XML(File.read("parts.xml"))
car_tires = @doc.xpath('//car:tire', 'car' => 'http://alicesautoparts.com/')
bike_tires = @doc.xpath('//bike:tire', 'bike' => 'http://bobsbikes.com/')
<books>
 <book>
 <title>Stars</title>
 </book>
 <book>
 <title>Moon</title>
 </book>
</books>
<feed xmlns="http://www.w3.org/2005/Atom">

 <title>Example Feed</title>
 <link href="http://example.org/"/>
 <updated>2003-12-13T18:30:02Z</updated>
 <author>
  <name>John Doe</name>
 </author>
 <id>urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6</id>

 <entry>
  <title>Atom-Powered Robots Run Amok</title>
  <link href="http://example.org/2003/12/13/atom03"/>
  <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
  <updated>2003-12-13T18:30:02Z</updated>
  <summary>Some text.</summary>
 </entry>
</feed>
$ apt-get install libxml2 libxslt


1、基础语法
一.一向以字符串方式得到nokogiri对象:

读取字符串:

相同景况,css的用法:

安装

require 'open-uri'
doc = Nokogiri::HTML(open("http://www.xxx.com/"))

读取文件:

贰、XML文件深入分析实例 从XML/HTML文件里抓取字段的常用方法:

对于Ubuntu,须求安装好 libxml二, libxslt 那八个零部件:

遵照上边提到的常规,xmlns已被机关绑定,不用再手动为xmlns赋值:

doc = Nokogiri::XML(File.open("blossom.xml")) do |config|
config.options = Nokogiri::XML::ParseOptions::STRICT | Nokogiri::XML::ParseOptions::NONET
end

更有可读性的css方法:

require 'open-uri'
doc = Nokogiri::HTML(open("http://www.threescompany.com/"))

于今有二个名称叫shows.xml的公文,内容如下:

@doc.xpath("//title")
f = File.open("blossom.xml")
doc = Nokogiri::XML(f)
f.close
f = File.open("blossom.xml")
doc = Nokogiri::XML(f)
f.close
characters = @doc.css("sitcoms name")
# => ["<name>Married with Children</name>", "<name>Perfect Strangers</name>"]

可以选用XPATH 以及 CSS selector 来寻觅: 比方,给定二个XML:

@doc.css("dramas name").first # => "<name>The A-Team</name>"
@doc.at_css("dramas name")  # => "<name>The A-Team</name>"

修改节点的组织

xpath和css方法,再次回到的是一个结点列表,类似于2个数组,它的原委正是从文件中检索出来的合乎相称规则的结点.

或者

@doc.xpath('//xmlns:title')
# => ["<title>Example Feed</title>", "<title>Atom-Powered Robots Run Amok</title>"]
html_doc = Nokogiri::HTML("<html><body><h1>Mr. Belvedere Fan Club</h1></body></html>")
xml_doc = Nokogiri::XML("<root><aliens><alien><name>Alf</name></alien></aliens></root>")
@doc = Nokogiri::XML(File.open("shows.xml"))
@doc.xpath("//character")

寻觅节点

<root>
 <sitcoms>
  <sitcom>
   <name>Married with Children</name>
   <characters>
    <character>Al Bundy</character>
    <character>Bud Bundy</character>
    <character>Marcy Darcy</character>
   </characters>
  </sitcom>
  <sitcom>
   <name>Perfect Strangers</name>
   <characters>
    <character>Larry Appleton</character>
    <character>Balki Bartokomous</character>
   </characters>
  </sitcom>
 </sitcoms>
 <dramas>
  <drama>
   <name>The A-Team</name>
   <characters>
    <character>John "Hannibal" Smith</character>
    <character>Templeton "Face" Peck</character>
    <character>"B.A." Baracus</character>
    <character>"Howling Mad" Murdock</character>
   </characters>
  </drama>
 </dramas>
</root>
@doc.css("book title")

二.也得以因此文件句柄获取nokogiri对象:

first_title = @doc.at_css('title')
second_book = @doc.css('book').last

# 可以把第一个title放到第二个book中
first_title.parent = second_book

# 也可以随意摆放。
second_book.add_next_sibling(first_title)

# 也可以修改对应的class
first_title.name = 'h2'
first_title['class']='red_color'
puts @doc.to_html
# => <h2 class='red_color'>...</h2>

# 也可以新建一个node
third_book = Nokogiri::XML::Node.new 'book', @doc
third_book.content = 'I am the third book'
second_book.add_next_sibling third_book
puts @doc.to_html
# =>
...
<books>
 ...
 <book>I am the third book</book>
</books>

这里的html_doc和xml_doc就是nokogiri文件

doc = Nokogiri::XML(File.open("blossom.xml")) do |config|
config.strict.nonet
end
<parts>
 <!-- Alice's Auto Parts Store -->
 <inventory xmlns="http://alicesautoparts.com/">
  <tire>all weather</tire>
  <tire>studded</tire>
  <tire>extra wide</tire>
 </inventory>

 <!-- Bob's Bike Shop -->
 <inventory xmlns="http://bobsbikes.com/">
  <tire>street</tire>
  <tire>mountain</tire>
 </inventory>
</parts>

能够从文件,字符串,UOdysseyL等来深入分析。靠的是那多少个措施 Nokogiri::HTML, Nokogiri::XML:

为了让namespace的接纳更有益,nokogiri会自动绑定在根结点上找到的贴切的任何namespace.
nokogiri会自动关联提供的U福睿斯L,这几个惯例能够削减代码量.
比如说有那般3个atom.xml文件:

解析

@doc.css('title')

可选拔使用办法例如(通过块调用):

假设想把具有character标签的开始和结果寻寻觅来,可以如此管理:

接下来就能够:

@doc.xpath("//dramas//character")
  • NOBLANKS : 删除空节点
  • NOENT : 代替实体
  • NOELX570ROSportage : 隐藏错误报告
  • STBMWX伍ICT : 精确剖判,当分析到文件特别时抛出荒唐
  • NONET : 在条分缕析时期不准其它互联网连接.
@doc.css('xmlns|title')

css:

html_doc = Nokogiri::HTML("<html><body><h1>Mr. Belvedere Fan Club</h1></body></html>")
xml_doc = Nokogiri::XML("<root><aliens><alien><name>Alf</name></alien></aliens></root>")

您或者感兴趣的篇章:

  • Ruby中XML格式数据管理库REXML的施用方法指南
  • 实例解析Ruby程序中调用REXML来深入分析XML格式数据的用法
  • Ruby使用REXML库来深入分析xml格式数据的主意
  • Ruby程序中开创和平消除析XML文件的章程
  • 在Ruby中拍卖XML和XSLT以及XPath的粗略教程
  • Ruby的XML格式数据深入分析库Nokogiri的应用进级

把dramas结点里的character结点列表查出来:

版权声明:本文由韦德娱乐1946_韦德娱乐1946网页版|韦德国际1946官网发布于网络编程,转载请注明出处:Ruby中使用Nokogiri包来操作XML格式数据的科目,R