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

تعليمات XML, XSLT و XPath لـ Ruby

ما هو XML?

XML تعني لغة العلامات القابلة للتمديد (eXtensible Markup Language).

لغة العلامات القابلة للتمديد، وهي مجموعة فرعية من لغة العلامات العامة، وهي لغة علامات تستخدم لتمييز وحدات الالكترونيات لتكون لها بنية.

يمكن استخدامها لتمييز البيانات، وتعريف أنواع البيانات، وهي لغة مصدر تسمح للمستخدمين بتعريف لغتهم العلامية الخاصة. وهي مناسبة جدًا للنقل عبر الإنترنت، وتقدم طريقة موحدة لوصف وتبادل بيانات منظمة مستقلة عن التطبيقات أو المزودين.

لمزيد من المعلومات، يرجى الرجوع إلى دليل XML

هيكل محولات XML وAPI

عناصر محولات XML الرئيسية هي DOM وSAX.

  • محول SAX يعتمد على معالجة الحدث، ويجب مسح مستند XML من البداية إلى النهاية، في عملية المسح، عند كل مرة يواجه بنية لغوية معينة، سيتم استدعاء برنامج معالجة الحدث الخاص بهذه البنية اللغوية، وإرسال حدث إلى التطبيق.

  • DOM هو نموذج وحدة مستند، يبني بنية النص الهرمية للمستند، ويقوم بإنشاء شجرة DOM في ذاكرة الوحدة، ويتم تمثيل عناصر شجرة DOM كأجسام، بعد تحليل المستند، سيتم وضع شجرة DOM بأكملها في ذاكرة الوحدة.

تحليل وإنتاج XML في Ruby

يمكن استخدام مكتبة REXML هذه لتحليل مستندات XML في Ruby.

مكتبة REXML هي مجموعة أدوات XML لـ Ruby، مكتوبة بلغة Ruby النقية، وتتبع معيار XML 1.0.

في إصدار Ruby 1.8 وما بعده، سيتم تضمين REXML في مكتبة Ruby القياسية.

مسار مكتبة REXML هو: rexml/document

تم تعبئة جميع الطرق والوحدات داخل وحدة REXML.

يملك محول REXML المزايا التالية مقارنة بالمحولات الأخرى:

  • 100% مكتوبة بلغة Ruby.

  • يمكن تطبيقه على محولات SAX وDOM.

  • إنه خفيف الوزن، لا يتجاوز 2000 سطر من البرمجة.

  • طرق ووحدات سهلة الفهم.

  • يستند إلى API SAX2 ودعم XPath الكامل.

  • تثبيت Ruby، دون الحاجة إلى تثبيت أي مكتبات إضافية.

أعلاه هو مثال على شفرة XML، احفظها كـ movies.xml:

<collection shelf="New Arrivals">
<movie title="Enemy Behind">
   <type>حرب، رعب</type>
   <format>DVD</format>
   <year>2003</year>
   <rating>PG</rating>
   <stars>10</stars>
   <description>تحدث عن حرب بين الولايات المتحدة واليابان</description>
</movie>
<movie title="Transformers">
   <type>أنيمة، خيال علمي</type>
   <format>DVD</format>
   <year>1989</year>
   <rating>R</rating>
   <stars>8</stars>
   <description>خيال علمي</description>
</movie>
   <movie title="Trigun">
   <type>أニمة، فعل</type>
   <format>DVD</format>
   <episodes>4</episodes>
   <rating>PG</rating>
   <stars>10</stars>
   <description>Vash the Stampede!</description>
</movie>
<movie title="Ishtar">
   <type>كوميدي</type>
   <format>VHS</format>
   <rating>PG</rating>
   <stars>2</stars>
   <description>ملخص يمكن مشاهدته</description>
</movie>
</collection>

مستشهد DOM

دعونا نبدأ بتحليل بيانات XML، أولاً دعونا نستورد مكتبة rexml/document، عادةً يمكننا دمج REXML في المساحة الاسمية العليا:

النموذج المتاح

#!/usr/bin/ruby -w
 
#!/usr/bin/ruby -w
require 'rexml/document'
 
include REXML
xmlfile = File.new("movies.xml")
 
# الحصول على عنصر root
root = xmldoc.root
puts "عنصر الجذر : " + root.attributes["shelf"]
 
# ستقوم بإخراج عنوان الفيلم
xmldoc.elements.each("collection/movie"){ 
   |e| puts "فيلم عنوان : " + e.attributes["title"] 
}
 
# سيتم عرض جميع أنواع الأفلام
xmldoc.elements.each("collection/movie/type") {
   |e| puts "نوع فيلم: " + e.text 
}
 
# سيتم عرض جميع وصفات الأفلام
xmldoc.elements.each("collection/movie/description") {
   |e| puts "وصف فيلم: " + e.text 
}

نتيجة العرض في المثال أعلاه هي:

عنصر جذر: New Arrivals
عنوان فيلم: العدو خلفي
عنوان فيلم: Transformers
عنوان فيلم: Trigun
عنوان فيلم: Ishtar
نوع فيلم: حرب،مثير للإثارة
نوع فيلم: أنمي،خيال علمي
نوع فيلم: أنمي،عنف
نوع فيلم: كوميدي
وصف فيلم: نتحدث عن حرب بين الولايات المتحدة واليابان
وصف فيلم: خيال علمي
وصف فيلم: Vash the Stampede!
وصف فيلم: فوضى مرئية
تحليل يشبه SAX:

مستشعر SAX

معالجة نفس ملف البيانات: movies.xml،لا ينصح باستخدام تحليل SAX لملف صغير،إليك مثال بسيط:

النموذج المتاح

#!/usr/bin/ruby -w
 
#!/usr/bin/ruby -w
require 'rexml/streamlistener'
require 'rexml/document'
 
 
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
include REXML
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 من خلال XPath في REXML يدعم، وهو قائم على التحليل العشبي (نموذج وثيقة).

النموذج المتاح

#!/usr/bin/ruby -w
 
#!/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
# طباعة جميع أنواع الأفلام
 
# الحصول على أنواع جميع الأفلام، العودة إلى مصفوفة
names = XPath.match(xmldoc, "//format").map {|x| x.text}
p names

نتيجة العرض في المثال أعلاه هي:

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

XSLT و Ruby

هناك مفسران لغة XSLT في Ruby، وسيتم تقديم وصف مختصر لهما أدناه:

Ruby-Sablotron

هذا المفسر تم كتابته ومحافظته عليه من قبل Masayoshi Takahashi. هذا المفسر تم كتابته بشكل رئيسي لمنصة Linux، ويحتاج إلى المكتبات التالية:

  • Sablot

  • Iconv

  • Expat

يمكنك العثور عليها في Ruby-Sablotron ابحث عن هذه المكتبات.

XSLT4R

تم كتابة XSLT4R من قبل Michael Neumann. XSLT4R يستخدم لتفاعل سلسلة الأوامر البسيطة، ويستطيع أن يستخدمه تطبيقات ثالثة لتحويل مستندات XML.

XSLT4R يحتاج إلى عملية XMLScan، وهي تحتوي على XSLT4R الأرشيف، وهو مكتبة 100% Ruby. يمكن تثبيت هذه المكتبات باستخدام طريقة تثبيت Ruby القياسية (أي install.rb).

تنسيق لغة XSLT4R كالتالي:

ruby xslt.rb stylesheet.xsl document.xml [المعلمات]

إذا كنت ترغب في استخدام 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 )

المزيد من المعلومات