English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Ruby XML, XSLT 및 XPath 튜토리얼

XML이 무엇인가요?

XML은 확장 가능 마크업 언어(eXtensible Markup Language)를 의미합니다.

확장 가능 마크업 언어는 표준 일반 마크업 언어의 하위 집합으로, 전자 문서를 구조화하는 데 사용되는 마크업 언어입니다.

데이터를 표시하고 데이터 타입을 정의할 수 있으며, 사용자가 자신의 표시 언어를 정의할 수 있는 소스 언어입니다. 이는 월드 와이드 웹 전송에 매우 적합하며, 애플리케이션 또는 공급자에 대한 독립적인 구조화 데이터를 설명하고 교환하는 일관된 방법을 제공합니다.

더 많은 내용은 우리의 XML 교본

XML 파서 구조와 API

XML 파서는 주로 DOM과 SAX 두 가지가 있습니다.

  • SAX 파서는 이벤트 처리 기반으로, XML 문서를从头부터 끝까지 스캔해야 합니다. 스캔 중에 각 문법 구조를 만나면 해당 문법 구조의 이벤트 처리 프로그램이 호출되고, 애플리케이션에 이벤트가 전달됩니다.

  • DOM은 문서 객체 모델 파싱으로, 문서의 분할 문법 구조를 구축하고, 메모리에서 DOM 트리를 구축합니다. DOM 트리의 노드는 객체 형태로 표시되며, 문서가 파싱되면 문서 전체 DOM 트리가 메모리에 저장됩니다.

Ruby에서 XML을 파싱 및 생성

RUBY에서 XML 문서를 파싱하는 데 사용할 수 있는 라이브러리는 REXML 라이브러리입니다.

REXML库是ruby的一个XML工具包,是使用纯Ruby语言编写的,遵守XML1.0规范。

在Ruby1.8版本及其以后,RUBY标准库中将包含REXML。

REXML库的路径是: rexml/document

所有的方法和类都被封装到一个REXML模块内。

REXML解析器比其他的解析器有以下优点:

  • 100% 由 Ruby 编写。

  • 可适用于 SAX 和 DOM 解析器。

  • 它是轻量级的,不到2000行代码。

  • 很容易理解的方法和类。

  • 基于 SAX2 API 和完整的 XPath 支持。

  • 使用 Ruby 安装,而无需单独安装。

以下为示例的 XML 代码,保存为movies.xml:



   War, Thriller
   DVD
   2003
   PG
   10
   Talk about a US-Japan war


   Anime, Science Fiction
   DVD
   1989
   R
   8
   A schientific fiction

   
   Anime, Action
   DVD
   4
   PG
   10
   Vash the Stampede!


   Comedy
   VHS
   PG
   2
   Viewable boredom

DOM 解析器

让我们先来解析 XML 数据,首先我们先引入 rexml/document 库,通常我们可以将 REXML 在顶级的命名空间中引入:

온라인 예제

#!/usr/bin/ruby -w
 
require 'rexml'/document'
include REXML
 
xmlfile = File.new("movies.xml")
xmldoc = Document.new(xmlfile)
 
# 获取 root 元素
root \u003d \u0078mldoc.root
puts "Root \u00a0element \u00a0: \u00a0" + root.attributes["shelf"]
 
root.attributes["shelf"]
xmldoc.elements.each("collection"/# 영화 제목을 출력합니다. 
   movie"){ + |e| puts "Movie Title: " 
}
 
e.attributes["title"]
xmldoc.elements.each("collection"/movie/# 모든 영화 유형을 출력합니다.
   |e| puts "Movie Type: " + e.text 
}
 
# 모든 영화 설명을 출력합니다.
xmldoc.elements.each("collection"/movie/description) {
   |e| puts "Movie Description: " + e.text 
}

위 예제의 출력 결과는 다음과 같습니다:

루트 요소: New Arrivals
Movie Title: 적 뒤에 있는 사람
Movie Title: Transformers
Movie Title: Trigun
Movie Title: 이스htar
Movie Type: 전쟁, 스릴러
Movie Type: 애니메이션, 과학 소설
Movie Type: 애니메이션, 액션
Movie Type: 코미디
Movie Description: 미국에 대해 이야기하자-일본 전쟁
Movie Description: 과학 소설
Movie Description: Vash the Stampede!
Movie Description: 관상할 만한 지루함
SAX-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*$/     # 공백문자 만
    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와 Ruby

우리는 XPath를 사용하여 XML을 확인할 수 있습니다. XPath는 XML 문서에서 정보를 찾는 언어입니다(보기:XPath 교육)。

XPath는 XML 경로 언어로, XML(표준 일반 마크업 언어의 하위 집합) 문서에서 특정 부분의 위치를 정의하는 언어입니다. XPath는 XML의 트리 구조를 기반으로 하여, 데이터 구조 트리에서 노드를 찾는 능력을 제공합니다.

Ruby는 REXML의 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'> ... </>
전쟁, 스릴러
애니메이션, 과학 소설
애니메이션, 액션
코미디
["DVD", "DVD", "DVD", "VHS"]

XSLT와 Ruby

Ruby에는 두 개의 XSLT 파서가 있습니다. 다음은 간단한 설명입니다:

Ruby-Sablotron

이 파서는 Masayoshi Takahashi에 의해 작성되고 유지보수되었습니다. 이는 주로 Linux 운영체제를 위해 작성되었으며 다음과 같은 라이브러리가 필요합니다:

  • Sablot

  • Iconv

  • Expat

다음과 같은 곳에서 사용할 수 있습니다: Ruby-Sablotron 이러한 라이브러리를 찾을 수 있습니다.

XSLT4R

XSLT4R는 Michael Neumann에 의해 작성되었습니다. XSLT4R는 간단한 명령줄 상호작용을 위해 사용되며, 제3자 애플리케이션에서 XML 문서를 변환하는 데 사용될 수 있습니다.

XSLT4R는 XMLScan 작업이 필요하며 XSLT를 포함하고 있습니다.4R 아카이브, 이는100%의 Ruby 모듈. 이 모듈은 표준 Ruby 설치 메서드(즉 Ruby install.rb)로 설치할 수 있습니다.

XSLT4R 문법 형식은 다음과 같습니다:

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

XSLT를 애플리케이션에서 사용하려면4R, 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 )

更多资料

  • 전체 REXML 파서, 문서를 참조하세요 REXML 파서 문서

  • 당신은 다음에서 가져올 수 있습니다. RAA 지식庫 중에서 다운로드 XSLT4R 。