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

Ruby XML, XSLT 和 XPath 教程

Was ist XML?

XML steht für erweiterbares Markup Language (eXtensible Markup Language).

Das erweiterte Markup-Sprache, eine Teilmenge des Standard Generalized Markup Language, ist eine Markup-Sprache, die verwendet wird, um elektronische Dokumente zu kennzeichnen und sie strukturiert zu machen.

Es kann verwendet werden, um Daten zu kennzeichnen, Datentypen zu definieren und ist eine Quellsprache, die es Benutzern ermöglicht, ihre eigene Markup-Sprache zu definieren. Es ist besonders geeignet für den Transfer im World Wide Web und bietet eine einheitliche Methode zur Beschreibung und Austausch von strukturierten Daten, die unabhängig von Anwendungen oder Anbietern sind.

Für mehr Informationen siehe unsere XML-Tutorial

Struktur und API des XML-Parsers

Die Hauptarten der XML-Parsen sind DOM und SAX.

  • Der SAX-Parser basiert auf Ereignisverarbeitung und erfordert, dass das XML-Dokument von Anfang bis Ende gescannt wird. Während des Scans wird bei jedem Auftreten einer Syntaxstruktur der spezifische Ereignisverarbeitungsprogramm aufgerufen und ein Ereignis an die Anwendung gesendet.

  • DOM ist die Dokumentobjektmodell-Parsing, das eine hierarchische Syntaxstruktur des Dokuments aufbaut, ein DOM-Baum im Speicher erstellt, die Knoten des DOM-Baums als Objekte kennzeichnet und das gesamte DOM-Baum des Dokuments im Speicher platziert, nachdem das Dokument geparst wurde.

XML-Parsing und -Erstellung in Ruby

In Ruby kann die Parsing von XML-Dokumenten mit dieser Bibliothek REXML durchgeführt werden.

Die REXML-Bibliothek ist ein XML-Toolkit für Ruby, das in reinem Ruby-Sprachgebrauch geschrieben ist und den XML-Standard einhält.1.0-Norm.

In Ruby1.8Version und höher, RUBY-Standardbibliothek wird REXML enthalten.

Der Pfad zur REXML-Bibliothek ist: rexml/document

Alle Methoden und Klassen sind in einem REXML-Modul verpackt.

REXML-Parser hat die folgenden Vorteile gegenüber anderen Parseibern:

  • 100% von Ruby geschrieben.

  • Eignet sich für SAX- und DOM-Parser.

  • Es ist leichtgewichtig, weniger als2000 Zeilen Code.

  • Einfach verständliche Methoden und Klassen.

  • Basierend auf SAX2 API und vollständige XPath-Unterstützung.

  • Mit Ruby installiert, ohne eine separate Installation.

Nachfolgendes ist ein Beispiel für XML-Code, speichern Sie ihn als movies.xml:

<collection shelf="New Arrivals">
<movie title="Enemy Behind">
   <type>Krieg, Thriller</type>
   <format>DVD</format>
   <jahr>2003</jahr>
   <bewertung>PG</bewertung>
   <stars>10</stars>
   <beschreibung>Reden wir über einen US-Japanischer Krieg</beschreibung>
</movie>
<movie title="Transformers">
   <type>Anime, Science Fiction</type>
   <format>DVD</format>
   <jahr>1989</jahr>
   <bewertung>R</bewertung>
   <stars>8</stars>
   <beschreibung>Eine wissenschaftliche Fiktion</beschreibung>
</movie>
   <movie title="Trigun">
   <type>Anime, Action</type>
   <format>DVD</format>
   <episoden>4</episoden>
   <bewertung>PG</bewertung>
   <stars>10</stars>
   <beschreibung>Vash the Stampede!</beschreibung>
</movie>
<movie title="Ishtar">
   <type>Komödie</type>
   <format>VHS</format>
   <bewertung>PG</bewertung>
   <stars>2</stars>
   <beschreibung>Anschaubarer Langeweile</beschreibung>
</movie>
</Kollektion>

DOM-Parser

Lassen Sie uns zunächst die XML-Daten analysieren,首先要引入 rexml/document-Bibliothek, normalerweise können wir REXML in der obersten Namensräume einfügen:

Online-Beispiel

#!/usr/bin/ruby -w
 
require 'rexml'/document'
include REXML
 
xmlfile = File.new("movies.xml")
xmldoc = Document.new(xmlfile)
 
# Erhalten des root Elements
root = xmldoc.root
puts "Wurzelelement : " + root.attributes["shelf"]
 
# Hier wird Filmtitel ausgegeben
xmldoc.elements.each("collection",/movie"){ 
   |e| puts "Film Titel: " + e.attributes["title"] 
}
 
# Hier wird alle Filmtypen ausgegeben
xmldoc.elements.each("collection",/movie/type") {
   |e| puts "Film Typ: " + e.text 
}
 
# Hier wird alle Filmbeschreibungen ausgegeben
xmldoc.elements.each("collection",/movie/description") {
   |e| puts "Film Beschreibung: " + e.text 
}

Der obige Beispiel-Ausgabeergebnis ist:

Wurzelelement: Neue Ankünfte
Film Titel: Enemy Behind
Film Titel: Transformers
Film Titel: Trigun
Film Titel: Ishtar
Film Typ: Krieg, Thriller
Film Typ: Anime, Science Fiction
Film Typ: Anime, Action
Film Typ: Komödie
Film Beschreibung: Über ein US-Japanischer Krieg
Film Beschreibung: Eine wissenschaftliche Fiktion
Film Beschreibung: Vash the Stampede!
Film Beschreibung: Ansichtswertung
SAX-wie Parsing:

SAX-Parser

Verarbeitung desselben Daten日期is: movies.xml, es wird nicht empfohlen, SAX für eine kleine Datei zu verwenden, hier ist ein einfaches Beispiel:

Online-Beispiel

#!/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(', ')}"
  ende
 
  def text(data)
    return if data =~ /^\w*$/     # Leere Zeichen nur
    abbrev = data[0..40] + (data.length > 40 ? "..." : "")
    puts "		text: #{abbrev.inspect}"
  ende
ende
 
list = MyListener.new
xmlfile = File.new("movies.xml")
Document.parse_stream(xmlfile, list)

Die obige Ausgabe ist:

tag_start: "Sammlung", {"Regal": "Neuankömmlinge"}
tag_start: "Film", {"title": "Feind im Rücken"}
tag_start: "Typ", {}
  text: "Krieg, Thriller"
tag_start: "Format", {}
tag_start: "Jahr", {}
tag_start: "Bewertung", {}
tag_start: "Sterne", {}
tag_start: "Beschreibung", {}
  text: "Reden wir über einen US-Japanischer Krieg
tag_start: "Film", {"title": "Transformers"}
tag_start: "Typ", {}
  text: "Anime, Science Fiction"
tag_start: "Format", {}
tag_start: "Jahr", {}
tag_start: "Bewertung", {}
tag_start: "Sterne", {}
tag_start: "Beschreibung", {}
  text: "Eine wissenschaftliche Fiktion"
tag_start: "Film", {"title": "Trigun"}
tag_start: "Typ", {}
  text: "Anime, Action"
tag_start: "Format", {}
tag_start: "Episoden", {}
tag_start: "Bewertung", {}
tag_start: "Sterne", {}
tag_start: "Beschreibung", {}
  text: "Vash the Stampede!"
tag_start: "Film", {"title": "Ishtar"}
tag_start: "Typ", {}
tag_start: "Format", {}
tag_start: "Bewertung", {}
tag_start: "Sterne", {}
tag_start: "Beschreibung", {}
  text: "Ansichtswertlose Langeweile"

XPath und Ruby

Wir können XPath verwenden, um XML anzuzeigen, XPath ist eine Sprache zur Suche nach Informationen in XML-Dokumenten (Ansicht:)XPath-Tutorial)。

XPath ist die XML-Path-Sprache, eine Sprache zur Bestimmung des Standorts eines Teils eines XML-Dokuments (Abteilung des Standardgenerellen Markup-Sprachens). XPath basiert auf der Baumstruktur von XML und bietet die Fähigkeit, Knoten in der Datenstrukturen-Baum zu finden.

Ruby unterstützt XPath über die REXML-Klasse, die auf einer Baumanalyse (Dokumentobjektmodell) basiert.

Online-Beispiel

#!/usr/bin/ruby -w
 
require 'rexml'/document'
include REXML
 
xmlfile = File.new("movies.xml")
xmldoc = Document.new(xmlfile)
 
# Informationen des ersten Films
movie = XPath.first(xmldoc, ""//movie)
p movie
 
# Alle Filmtypen drucken
XPath.each(xmldoc, ""//type) { |e| puts e.text }
 
# Alle Filmformate-Typen erhalten, Array zurückgeben
names = XPath.match(xmldoc, ""//format).map { |x| x.text }
p names

Der obige Beispiel-Ausgabeergebnis ist:

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

XSLT und Ruby

Ruby hat zwei XSLT-Parser. Nachfolgend finden Sie eine kurze Beschreibung:

Ruby-Sablotron

Dieser Parser wurde von Masayoshi Takahashi geschrieben und gepflegt. Er wurde hauptsächlich für den Linux-Betriebssystem written, und erfordert die folgenden Bibliotheken:

  • Sablot

  • Iconv

  • Expat

Sie können Ruby-Sablotron Diese Bibliotheken finden Sie.

XSLT4R

XSLT4R wurde von Michael Neumann geschrieben. XSLT4R wird für einfache Kommandozeileninteraktionen verwendet und kann von Drittanbieteranwendungen verwendet werden, um XML-Dokumente zu konvertieren.

XSLT4R benötigt die XMLScan-Operation und enthält XSLT4R-Archiv, das ist ein100% der Ruby-Module. Diese Module können mit den Standard-Ruby-Installationsmethoden (d.h. Ruby install.rb) installiert werden.

XSLT4R-Syntax-Format wie folgt:

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

Wenn Sie XSLT in einer Anwendung verwenden möchten4R, Sie können XSLT einbinden und die erforderlichen Parameter eingeben. Ein Beispiel ist wie folgt:

Online-Beispiel

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 )

更多资料