Latest web development tutorials

루비 XML, XSLT와 XPath를 자습서

XML은 무엇입니까?

그것은 확장 마크 업 언어 XML (확장 마크 업 언어)을 의미한다.

확장 마크 업 언어 표준 일반화 마크 업 언어로 구조화 된 마크 업 언어를 갖는 전자 문서를 표시하는 방법의 서브 세트.

는 데이터 유형을 정의하는 데이터를 태그를 사용할 수 있으며, 사용자가 자신의 마크 업 언어 소스 언어를 정의 할 수 있도록하는 기술이다. 그것은 설명하고 응용 프로그램이나 구조화 된 데이터의 벤더 독립적 교환에 대한 통합 된 접근 방식을 제공, 웹 전송에 적합하다.

자세한 내용은 우리의 참조하시기 바랍니다 XML 자습서를


XML 파서와 API 구조

XML 파서 SAX와 DOM은 주로 이가지 있습니다.

  • SAX 파서 이벤트 기반 처리되면, XML 문서 스캐닝은 스캐닝 과정에서 다시 처음부터 끝까지 필요 문법 구조가 발생하는 때마다, 응용 프로그램을 보내고, 이벤트 핸들러를 특정 문법 구조를 호출 이벤트.
  • DOM 문서 객체 모델 분석, 문서의 계층 구조 문법 구조, 문서 Wencheng를 분석, 파악하는 것을 목적으로 메모리 DOM 트리 노드에 DOM 트리를 구축, 전체 DOM 트리가 메모리에 기록됩니다.

루비는 구문 분석하고 XML을 만들 수 있습니다

XML 문서의 루비 구문 분석이 라이브러리 REXML 라이브러리를 사용할 수 있습니다.

REXML 라이브러리는 XML 툴킷 루비, 순수 루비 언어를 사용 XML1.0 규범을 따르도록입니다.

Ruby1.8 및 이후 버전에서, 라이브러리는 루비 REXML 포함됩니다.

경로 REXML 라이브러리는 다음과 같습니다 REXML / 문서

모든 메소드와 클래스는 REXML 모듈로 패키징되어있다.

REXML 파서 다른 파서에 비해 다음과 같은 장점이있다 :

  • 루비에 의해 작성된 100 %.
  • 적용은 SAX와 DOM 파서합니다.
  • 그것은 코드 2000 라인보다 가볍고입니다.
  • 쉬운 방법과 클래스를 이해합니다.
  • 기반 SAX2의 API 및 전체 XPath를 지원.
  • 별도의 설치를 필요로하지 않고, 루비 설치를 사용합니다.

다음은 movies.xml로 저장, XML 코드의 예입니다 :

<collection shelf="New Arrivals">
<movie title="Enemy Behind">
   <type>War, Thriller</type>
   <format>DVD</format>
   <year>2003</year>
   <rating>PG</rating>
   <stars>10</stars>
   <description>Talk about a US-Japan war</description>
</movie>
<movie title="Transformers">
   <type>Anime, Science Fiction</type>
   <format>DVD</format>
   <year>1989</year>
   <rating>R</rating>
   <stars>8</stars>
   <description>A schientific fiction</description>
</movie>
   <movie title="Trigun">
   <type>Anime, Action</type>
   <format>DVD</format>
   <episodes>4</episodes>
   <rating>PG</rating>
   <stars>10</stars>
   <description>Vash the Stampede!</description>
</movie>
<movie title="Ishtar">
   <type>Comedy</type>
   <format>VHS</format>
   <rating>PG</rating>
   <stars>2</stars>
   <description>Viewable boredom</description>
</movie>
</collection>

DOM 파서

의 XML 데이터를 구문 분석 시작하자 먼저 우리가 REXML / 문서 라이브러리를 도입, 우리가 일반적으로 도입 최상위 네임 스페이스 REXML에있을 수 있습니다 :

#!/usr/bin/ruby -w

require 'rexml/document'
include REXML

xmlfile = File.new("movies.xml")
xmldoc = Document.new(xmlfile)

# 获取 root 元素
root = xmldoc.root
puts "Root element : " + root.attributes["shelf"]

# 以下将输出电影标题
xmldoc.elements.each("collection/movie"){ 
   |e| puts "Movie Title : " + e.attributes["title"] 
}

# 以下将输出所有电影类型
xmldoc.elements.each("collection/movie/type") {
   |e| puts "Movie Type : " + e.text 
}

# 以下将输出所有电影描述
xmldoc.elements.each("collection/movie/description") {
   |e| puts "Movie Description : " + e.text 
}

위 예제의 출력은 다음과 같습니다

Root element : New Arrivals
Movie Title : Enemy Behind
Movie Title : Transformers
Movie Title : Trigun
Movie Title : Ishtar
Movie Type : War, Thriller
Movie Type : Anime, Science Fiction
Movie Type : Anime, Action
Movie Type : Comedy
Movie Description : Talk about a US-Japan war
Movie Description : A schientific fiction
Movie Description : Vash the Stampede!
Movie Description : Viewable boredom
SAX-like Parsing:

SAX 파서

동일한 데이터 파일 처리 : movies.xml을, SAX 구문 분석이 작은 파일로 권장하지 않습니다, 다음은 간단한 예입니다 :

#!/usr/bin/ruby -w

require 'rexml/document'
require 'rexml/streamlistener'
include REXML


class MyListener
  include REXML::StreamListener
  def tag_start(*args)
    puts "tag_start: #{args.map {|x| x.inspect}.join(', ')}"
  end

  def text(data)
    return if data =~ /^\w*$/     # whitespace only
    abbrev = data[0..40] + (data.length > 40 ? "..." : "")
    puts "  text   :   #{abbrev.inspect}"
  end
end

list = MyListener.new
xmlfile = File.new("movies.xml")
Document.parse_stream(xmlfile, list)

출력은 상기 :

tag_start: "collection", {"shelf"=>"New Arrivals"}
tag_start: "movie", {"title"=>"Enemy Behind"}
tag_start: "type", {}
  text   :   "War, Thriller"
tag_start: "format", {}
tag_start: "year", {}
tag_start: "rating", {}
tag_start: "stars", {}
tag_start: "description", {}
  text   :   "Talk about a US-Japan war"
tag_start: "movie", {"title"=>"Transformers"}
tag_start: "type", {}
  text   :   "Anime, Science Fiction"
tag_start: "format", {}
tag_start: "year", {}
tag_start: "rating", {}
tag_start: "stars", {}
tag_start: "description", {}
  text   :   "A schientific fiction"
tag_start: "movie", {"title"=>"Trigun"}
tag_start: "type", {}
  text   :   "Anime, Action"
tag_start: "format", {}
tag_start: "episodes", {}
tag_start: "rating", {}
tag_start: "stars", {}
tag_start: "description", {}
  text   :   "Vash the Stampede!"
tag_start: "movie", {"title"=>"Ishtar"}
tag_start: "type", {}
tag_start: "format", {}
tag_start: "rating", {}
tag_start: "stars", {}
tag_start: "description", {}
  text   :   "Viewable boredom"

XPath를 루비

, XPath에이 정보를 XML 언어의 문서입니다 찾기 위해 우리는 (:보기 XML을 볼 수 XPath를 사용하여 XPath를 자습서 ).

XPath는 그것이 XML 문서 언어 위치 부분 (표준 일반화 마크 업 언어의 서브 세트)를 결정하는데 사용되는 방법은 XML 경로 언어이다. XML 트리의 XPath 기반 및 트리 데이터 구조의 노드들에 대해보고 할 수있는 능력을 제공한다.

분석 (문서 객체 모델) 트리를 기반으로 REXML 클래스에 의해 루비의 XPath를 지원 XPath에.

#!/usr/bin/ruby -w

require 'rexml/document'
include REXML

xmlfile = File.new("movies.xml")
xmldoc = Document.new(xmlfile)

# 第一个电影的信息
movie = XPath.first(xmldoc, "//movie")
p movie

# 打印所有电影类型
XPath.each(xmldoc, "//type") { |e| puts e.text }

# 获取所有电影格式的类型,返回数组
names = XPath.match(xmldoc, "//format").map {|x| x.text }
p names

위 예제의 출력은 다음과 같습니다

<movie title='Enemy Behind'> ... </>
War, Thriller
Anime, Science Fiction
Anime, Action
Comedy
["DVD", "DVD", "DVD", "VHS"]

XSLT와 루비

루비는 간단한 설명이 아래에 주어진 두 개의 XSLT 파서를 가지고 :

루비 Sablotron

이 파서는 정의 마사요시 Takahash에 의해 작성되고 유지된다. 이것은 주로 리눅스 운영 체제를 대상으로 다음과 같은 라이브러리가 필요합니다 :

  • Sablot
  • 의 iconv
  • 해외 거주자

당신은 할 수 있습니다 루비 Sablotron는 이 라이브러리를 찾을 수 있습니다.

XSLT4R

XSLT4R 마이클 노이만에 의해 작성. 간단한 명령 줄 상호 작용을위한 XSLT4R는 타사 응용 프로그램은 XML 문서를 변환하는 데 사용할 수 있습니다.

XSLT4R은 100 % 루비 모듈입니다 XSLT4R 아카이브를 포함, XMLScan 작업을해야합니다. 이 모듈은 표준 루비 설치 방법 (즉, 루비 install.rb) 설치를 사용할 수 있습니다.

다음과 같이 XSLT4R 구문은 다음과 같습니다

ruby xslt.rb stylesheet.xsl document.xml [arguments]

응용 프로그램에서 XSLT4R를 사용하려는 경우, 당신은 당신이 필요로하는 XSLT 및 입력 매개 변수를 도입 할 수 있습니다. 다음 예는 다음과 같다 :

require "xslt"

stylesheet = File.readlines("stylesheet.xsl").to_s
xml_doc = File.readlines("document.xml").to_s
arguments = { 'image_dir' => '/....' }

sheet = XSLT::Stylesheet.new( stylesheet, arguments )

# output to StdOut
sheet.apply( xml_doc )

# output to 'str'
str = ""
sheet.output = [ str ]
sheet.apply( xml_doc )

추가 정보