the-experimenters-rdf-rdfxml 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.yardopts +13 -0
- data/AUTHORS +1 -0
- data/CONTRIBUTORS +1 -0
- data/History.rdoc +100 -0
- data/README +95 -0
- data/README.md +95 -0
- data/Rakefile +59 -0
- data/UNLICENSE +24 -0
- data/VERSION +1 -0
- data/etc/doap.nt +47 -0
- data/etc/doap.xml +73 -0
- data/example.rb +37 -0
- data/lib/rdf/rdfxml.rb +50 -0
- data/lib/rdf/rdfxml/format.rb +43 -0
- data/lib/rdf/rdfxml/patches/array_hacks.rb +53 -0
- data/lib/rdf/rdfxml/patches/graph_properties.rb +34 -0
- data/lib/rdf/rdfxml/patches/literal_hacks.rb +156 -0
- data/lib/rdf/rdfxml/patches/nokogiri_hacks.rb +16 -0
- data/lib/rdf/rdfxml/reader.rb +646 -0
- data/lib/rdf/rdfxml/version.rb +18 -0
- data/lib/rdf/rdfxml/vocab.rb +3 -0
- data/lib/rdf/rdfxml/writer.rb +559 -0
- data/rdf-rdfxml.gemspec +109 -0
- data/script/console +10 -0
- data/script/parse +55 -0
- data/script/tc +50 -0
- data/script/yard-to-rubyforge +2 -0
- data/spec/.gitignore +1 -0
- data/spec/format_spec.rb +28 -0
- data/spec/graph_spec.rb +59 -0
- data/spec/literal_spec.rb +244 -0
- data/spec/matchers.rb +79 -0
- data/spec/rdf_test.rb +69 -0
- data/spec/reader_spec.rb +361 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +53 -0
- data/spec/writer_spec.rb +714 -0
- metadata +190 -0
data/etc/doap.xml
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<rdf:RDF xmlns="http://usefulinc.com/ns/doap#"
|
3
|
+
xmlns:log="http://www.w3.org/2000/10/swap/log#"
|
4
|
+
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
|
5
|
+
|
6
|
+
<Person xmlns="http://xmlns.com/foaf/0.1/"
|
7
|
+
rdf:about="#_ggenid1">
|
8
|
+
<mbox_sha1sum>c69f3255ff0639543cc5edfd8116eac8df16fab8</mbox_sha1sum>
|
9
|
+
<name>Hellekin O. Wolf</name>
|
10
|
+
</Person>
|
11
|
+
|
12
|
+
<Person xmlns="http://xmlns.com/foaf/0.1/"
|
13
|
+
rdf:about="#_ggenid3">
|
14
|
+
<mbox_sha1sum>bedbbf2451e5beb38d59687c0460032aff92cd3c</mbox_sha1sum>
|
15
|
+
<name>Pius Uzamere</name>
|
16
|
+
</Person>
|
17
|
+
|
18
|
+
<Person xmlns="http://xmlns.com/foaf/0.1/"
|
19
|
+
rdf:about="#_ggenid2">
|
20
|
+
<mbox_sha1sum>f7653fc1ac0e82ebb32f092389bd5fc728eaae12</mbox_sha1sum>
|
21
|
+
<name>John Fieber</name>
|
22
|
+
</Person>
|
23
|
+
|
24
|
+
<Person xmlns="http://xmlns.com/foaf/0.1/"
|
25
|
+
rdf:about="http://ar.to/#self">
|
26
|
+
<isDefinedBy xmlns="http://www.w3.org/2000/01/rdf-schema#"
|
27
|
+
rdf:resource="http://datagraph.org/bendiken/foaf"/>
|
28
|
+
<homepage rdf:resource="http://ar.to/"/>
|
29
|
+
<made rdf:resource="http://rubygems.org/gems/rdf"/>
|
30
|
+
<mbox rdf:resource="mailto:arto.bendiken@gmail.com"/>
|
31
|
+
<mbox_sha1sum>a033f652c84a4d73b8c26d318c2395699dd2bdfb</mbox_sha1sum>
|
32
|
+
<mbox_sha1sum>d0737cceb55eb7d740578d2db1bc0727e3ed49ce</mbox_sha1sum>
|
33
|
+
<name>Arto Bendiken</name>
|
34
|
+
</Person>
|
35
|
+
|
36
|
+
<Person xmlns="http://xmlns.com/foaf/0.1/"
|
37
|
+
rdf:about="http://bhuga.net/#ben">
|
38
|
+
<isDefinedBy xmlns="http://www.w3.org/2000/01/rdf-schema#"
|
39
|
+
rdf:resource="http://datagraph.org/bhuga/foaf"/>
|
40
|
+
<homepage rdf:resource="http://bhuga.net/"/>
|
41
|
+
<mbox rdf:resource="mailto:blavender@gmail.com"/>
|
42
|
+
<mbox_sha1sum>dbf45f4ffbd27b67aa84f02a6a31c144727d10af</mbox_sha1sum>
|
43
|
+
<name>Ben Lavender</name>
|
44
|
+
</Person>
|
45
|
+
|
46
|
+
<Project rdf:about="http://rubygems.org/gems/rdf">
|
47
|
+
<creator xmlns="http://purl.org/dc/terms/"
|
48
|
+
rdf:resource="http://ar.to/#self"/>
|
49
|
+
<blog rdf:resource="http://ar.to/"/>
|
50
|
+
<blog rdf:resource="http://blog.datagraph.org/"/>
|
51
|
+
<bug-database rdf:resource="http://github.com/bendiken/rdf/issues"/>
|
52
|
+
<category rdf:resource="http://dbpedia.org/resource/Resource_Description_Framework"/>
|
53
|
+
<category rdf:resource="http://dbpedia.org/resource/Ruby_(programming_language)"/>
|
54
|
+
<created>2007-10-23</created>
|
55
|
+
<description xml:lang="en">RDF.rb is a pure-Ruby library for working with Resource Description Framework (RDF) data.</description>
|
56
|
+
<developer rdf:resource="http://ar.to/#self"/>
|
57
|
+
<developer rdf:resource="http://bhuga.net/#ben"/>
|
58
|
+
<documenter rdf:resource="http://ar.to/#self"/>
|
59
|
+
<download-page rdf:resource="http://rubyforge.org/projects/rdf/"/>
|
60
|
+
<helper rdf:resource="#_ggenid1"/>
|
61
|
+
<helper rdf:resource="#_ggenid2"/>
|
62
|
+
<helper rdf:resource="#_ggenid3"/>
|
63
|
+
<homepage rdf:resource="http://rdf.rubyforge.org/"/>
|
64
|
+
<license rdf:resource="http://creativecommons.org/licenses/publicdomain/"/>
|
65
|
+
<maintainer rdf:resource="http://ar.to/#self"/>
|
66
|
+
<name>RDF.rb</name>
|
67
|
+
<platform>Ruby</platform>
|
68
|
+
<shortdesc xml:lang="en">A Ruby library for working with Resource Description Framework (RDF) data.</shortdesc>
|
69
|
+
<vendor rdf:resource="http://datagraph.org/"/>
|
70
|
+
<maker xmlns="http://xmlns.com/foaf/0.1/"
|
71
|
+
rdf:resource="http://ar.to/#self"/>
|
72
|
+
</Project>
|
73
|
+
</rdf:RDF>
|
data/example.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$:.unshift(File.join(File.dirname(__FILE__), 'lib'))
|
4
|
+
|
5
|
+
require 'rubygems'
|
6
|
+
require 'rdf/rdfxml'
|
7
|
+
|
8
|
+
data = <<-EOF;
|
9
|
+
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
10
|
+
xmlns:ex="http://www.example.org/" xml:lang="en" xml:base="http://www.example.org/foo">
|
11
|
+
<ex:Thing rdf:about="http://example.org/joe" ex:name="bar">
|
12
|
+
<ex:belongsTo rdf:resource="http://tommorris.org/" />
|
13
|
+
<ex:sampleText rdf:datatype="http://www.w3.org/2001/XMLSchema#string">foo</ex:sampleText>
|
14
|
+
<ex:hadADodgyRelationshipWith>
|
15
|
+
<rdf:Description>
|
16
|
+
<ex:name>Tom</ex:name>
|
17
|
+
<ex:hadADodgyRelationshipWith>
|
18
|
+
<rdf:Description>
|
19
|
+
<ex:name>Rob</ex:name>
|
20
|
+
<ex:hadADodgyRelationshipWith>
|
21
|
+
<rdf:Description>
|
22
|
+
<ex:name>Mary</ex:name>
|
23
|
+
</rdf:Description>
|
24
|
+
</ex:hadADodgyRelationshipWith>
|
25
|
+
</rdf:Description>
|
26
|
+
</ex:hadADodgyRelationshipWith>
|
27
|
+
</rdf:Description>
|
28
|
+
</ex:hadADodgyRelationshipWith>
|
29
|
+
</ex:Thing>
|
30
|
+
</rdf:RDF>
|
31
|
+
EOF
|
32
|
+
|
33
|
+
RDF::RDFXML::Reader.new(data, :base_uri => 'http://example.org/example.xml') do |reader|
|
34
|
+
reader.each_statement do |statement|
|
35
|
+
statement.inspect!
|
36
|
+
end
|
37
|
+
end
|
data/lib/rdf/rdfxml.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
$:.unshift(File.expand_path(File.join(File.dirname(__FILE__), '..')))
|
2
|
+
require 'rdf'
|
3
|
+
|
4
|
+
module RDF
|
5
|
+
##
|
6
|
+
# **`RDF::RDFXML`** is an RDF/XML plugin for RDF.rb.
|
7
|
+
#
|
8
|
+
# @example Requiring the `RDF::RDFXML` module
|
9
|
+
# require 'rdf/rdfxml'
|
10
|
+
#
|
11
|
+
# @example Parsing RDF statements from an XHTML+RDFXML file
|
12
|
+
# RDF::RDFXML::Reader.open("etc/foaf.xml") do |reader|
|
13
|
+
# reader.each_statement do |statement|
|
14
|
+
# puts statement.inspect
|
15
|
+
# end
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# @see http://rdf.rubyforge.org/
|
19
|
+
# @see http://www.w3.org/TR/REC-rdf-syntax/
|
20
|
+
#
|
21
|
+
# @author [Gregg Kellogg](http://kellogg-assoc.com/)
|
22
|
+
module RDFXML
|
23
|
+
require 'rdf/rdfxml/format'
|
24
|
+
require 'rdf/rdfxml/vocab'
|
25
|
+
require 'rdf/rdfxml/patches/array_hacks'
|
26
|
+
require 'rdf/rdfxml/patches/literal_hacks'
|
27
|
+
require 'rdf/rdfxml/patches/nokogiri_hacks'
|
28
|
+
autoload :Reader, 'rdf/rdfxml/reader'
|
29
|
+
autoload :Writer, 'rdf/rdfxml/writer'
|
30
|
+
autoload :VERSION, 'rdf/rdfxml/version'
|
31
|
+
autoload :XML, 'rdf/rdfxml/vocab'
|
32
|
+
|
33
|
+
# Regexp matching an NCName.
|
34
|
+
NC_REGEXP = Regexp.new(
|
35
|
+
%{^
|
36
|
+
(?!\\\\u0301) # ́ is a non-spacing acute accent.
|
37
|
+
# It is legal within an XML Name, but not as the first character.
|
38
|
+
( [a-zA-Z_]
|
39
|
+
| \\\\u[0-9a-fA-F]
|
40
|
+
)
|
41
|
+
( [0-9a-zA-Z_\.-]
|
42
|
+
| \\\\u([0-9a-fA-F]{4})
|
43
|
+
)*
|
44
|
+
$},
|
45
|
+
Regexp::EXTENDED)
|
46
|
+
|
47
|
+
def self.debug?; @debug; end
|
48
|
+
def self.debug=(value); @debug = value; end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module RDF::RDFXML
|
2
|
+
##
|
3
|
+
# RDFXML format specification.
|
4
|
+
#
|
5
|
+
# @example Obtaining an RDFXML format class
|
6
|
+
# RDF::Format.for(:rdf) # RDF::RDFXML::Format
|
7
|
+
# RDF::Format.for(:rdfxml) # RDF::RDFXML::Format
|
8
|
+
# RDF::Format.for("etc/foaf.xml")
|
9
|
+
# RDF::Format.for(:file_name => "etc/foaf.xml")
|
10
|
+
# RDF::Format.for(:file_extension => "xml")
|
11
|
+
# RDF::Format.for(:file_extension => "rdf")
|
12
|
+
# RDF::Format.for(:content_type => "application/xml")
|
13
|
+
# RDF::Format.for(:content_type => "application/rdf+xml")
|
14
|
+
#
|
15
|
+
# @example Obtaining serialization format MIME types
|
16
|
+
# RDF::Format.content_types #=> {"application/rdf+xml" => [RDF::RDFXML::Format]}
|
17
|
+
#
|
18
|
+
# @example Obtaining serialization format file extension mappings
|
19
|
+
# RDF::Format.file_extensions #=> {:rdf => "application/rdf+xml"}
|
20
|
+
#
|
21
|
+
# @see http://www.w3.org/TR/rdf-testcases/#ntriples
|
22
|
+
class Format < RDF::Format
|
23
|
+
content_type 'application/xml', :extension => :xml
|
24
|
+
content_type 'application/rdf+xml', :extension => :rdf
|
25
|
+
content_encoding 'utf-8'
|
26
|
+
|
27
|
+
reader { RDF::RDFXML::Reader }
|
28
|
+
writer { RDF::RDFXML::Writer }
|
29
|
+
end
|
30
|
+
|
31
|
+
# Aliases for this format
|
32
|
+
#
|
33
|
+
# This allows the following:
|
34
|
+
#
|
35
|
+
# @example Obtaining an RDFXML format class
|
36
|
+
# RDF::Format.for(:xml) # RDF::RDFXML::XML
|
37
|
+
# RDF::Format.for(:xml).reader # RDF::RDFXML::Reader
|
38
|
+
# RDF::Format.for(:xml).writer # RDF::RDFXML::Writer
|
39
|
+
class XML < RDF::Format
|
40
|
+
reader { RDF::RDFXML::Reader }
|
41
|
+
writer { RDF::RDFXML::Writer }
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
class Array
|
2
|
+
# http://wiki.rubygarden.org/Ruby/page/show/ArrayPermute
|
3
|
+
# Permute an array, and call a block for each permutation
|
4
|
+
# Author: Paul Battley
|
5
|
+
def permute(prefixed=[])
|
6
|
+
if (length < 2)
|
7
|
+
# there are no elements left to permute
|
8
|
+
yield(prefixed + self)
|
9
|
+
else
|
10
|
+
# recursively permute the remaining elements
|
11
|
+
each_with_index do |e, i|
|
12
|
+
(self[0,i]+self[(i+1)..-1]).permute(prefixed+[e]) { |a| yield a }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end unless Array.method_defined?(:permute)
|
16
|
+
|
17
|
+
# Converts the array to a comma-separated sentence where the last element is joined by the connector word. Options:
|
18
|
+
# * <tt>:words_connector</tt> - The sign or word used to join the elements in arrays with two or more elements (default: ", ")
|
19
|
+
# * <tt>:two_words_connector</tt> - The sign or word used to join the elements in arrays with two elements (default: " and ")
|
20
|
+
# * <tt>:last_word_connector</tt> - The sign or word used to join the last element in arrays with three or more elements (default: ", and ")
|
21
|
+
def to_sentence(options = {})
|
22
|
+
default_words_connector = ", "
|
23
|
+
default_two_words_connector = " and "
|
24
|
+
default_last_word_connector = ", and "
|
25
|
+
|
26
|
+
# Try to emulate to_senteces previous to 2.3
|
27
|
+
if options.has_key?(:connector) || options.has_key?(:skip_last_comma)
|
28
|
+
::ActiveSupport::Deprecation.warn(":connector has been deprecated. Use :words_connector instead", caller) if options.has_key? :connector
|
29
|
+
::ActiveSupport::Deprecation.warn(":skip_last_comma has been deprecated. Use :last_word_connector instead", caller) if options.has_key? :skip_last_comma
|
30
|
+
|
31
|
+
skip_last_comma = options.delete :skip_last_comma
|
32
|
+
if connector = options.delete(:connector)
|
33
|
+
options[:last_word_connector] ||= skip_last_comma ? connector : ", #{connector}"
|
34
|
+
else
|
35
|
+
options[:last_word_connector] ||= skip_last_comma ? default_two_words_connector : default_last_word_connector
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# options.assert_valid_keys(:words_connector, :two_words_connector, :last_word_connector, :locale)
|
40
|
+
options = {:words_connector => default_words_connector, :two_words_connector => default_two_words_connector, :last_word_connector => default_last_word_connector}.merge(options)
|
41
|
+
|
42
|
+
case length
|
43
|
+
when 0
|
44
|
+
""
|
45
|
+
when 1
|
46
|
+
self[0].to_s
|
47
|
+
when 2
|
48
|
+
"#{self[0]}#{options[:two_words_connector]}#{self[1]}"
|
49
|
+
else
|
50
|
+
"#{self[0...-1].join(options[:words_connector])}#{options[:last_word_connector]}#{self[-1]}"
|
51
|
+
end
|
52
|
+
end unless Array.method_defined?(:to_sentence)
|
53
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module RDF
|
2
|
+
class Graph
|
3
|
+
# Resource properties
|
4
|
+
#
|
5
|
+
# Properties arranged as a hash with the predicate Term as index to an array of resources or literals
|
6
|
+
#
|
7
|
+
# Example:
|
8
|
+
# graph.load(':foo a :bar; rdfs:label "An example" .', "http://example.com/")
|
9
|
+
# graph.resources(URI.new("http://example.com/subject")) =>
|
10
|
+
# {
|
11
|
+
# "http://www.w3.org/1999/02/22-rdf-syntax-ns#type" => [<http://example.com/#bar>],
|
12
|
+
# "http://example.com/#label" => ["An example"]
|
13
|
+
# }
|
14
|
+
def properties(subject, recalc = false)
|
15
|
+
@properties ||= {}
|
16
|
+
@properties.delete(subject.to_s) if recalc
|
17
|
+
@properties[subject.to_s] ||= begin
|
18
|
+
hash = Hash.new
|
19
|
+
self.query(:subject => subject) do |statement|
|
20
|
+
pred = statement.predicate.to_s
|
21
|
+
|
22
|
+
hash[pred] ||= []
|
23
|
+
hash[pred] << statement.object
|
24
|
+
end
|
25
|
+
hash
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Get type(s) of subject, returns a list of symbols
|
30
|
+
def type_of(subject)
|
31
|
+
query(:subject => subject, :predicate => RDF.type).map {|st| st.object}
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,156 @@
|
|
1
|
+
# Use Nokogiri or LibXML when available, and REXML otherwise:
|
2
|
+
begin
|
3
|
+
require 'nokogiri'
|
4
|
+
rescue LoadError => e
|
5
|
+
begin
|
6
|
+
require 'libxml'
|
7
|
+
rescue LoadError => e
|
8
|
+
:rexml
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
module RDF; class Literal
|
13
|
+
##
|
14
|
+
# An XML literal.
|
15
|
+
#
|
16
|
+
# @see http://www.w3.org/TR/rdf-concepts/#section-XMLLiteral
|
17
|
+
# @see http://www.w3.org/TR/rdfa-core/#s_xml_literals
|
18
|
+
# @since 0.2.1
|
19
|
+
class XML < Literal
|
20
|
+
##
|
21
|
+
# @param [Object] value
|
22
|
+
# @option options [String] :lexical (nil)
|
23
|
+
# @option options [Hash] :namespaces ({}) Use "" to declare default namespace
|
24
|
+
# @option options [Symbol] :language (nil)
|
25
|
+
# @option options [:nokogiri, :libxml, or :rexml] :library
|
26
|
+
def initialize(value, options = {})
|
27
|
+
options[:namespaces] ||= {}
|
28
|
+
|
29
|
+
@library = case options[:library]
|
30
|
+
when nil
|
31
|
+
case
|
32
|
+
when defined?(::Nokogiri) then :nokogiri
|
33
|
+
when defined?(::LibXML) then :libxml
|
34
|
+
else :rexml
|
35
|
+
end
|
36
|
+
when :nokogiri, :libxml, :rexml
|
37
|
+
options[:library]
|
38
|
+
else
|
39
|
+
raise ArgumentError.new("expected :rexml, :libxml or :nokogiri, but got #{options[:library].inspect}")
|
40
|
+
end
|
41
|
+
|
42
|
+
@datatype = options[:datatype] || DATATYPE
|
43
|
+
@string = options[:lexical] if options.has_key?(:lexical)
|
44
|
+
@object = parse_value(value, options)
|
45
|
+
@string = serialize_nodeset(@object)
|
46
|
+
end
|
47
|
+
|
48
|
+
##
|
49
|
+
# Converts the literal into its canonical lexical representation.
|
50
|
+
#
|
51
|
+
# @return [Literal]
|
52
|
+
# @see http://www.w3.org/TR/xml-exc-c14n/
|
53
|
+
def canonicalize
|
54
|
+
# This is the opportunity to use exclusive canonicalization library
|
55
|
+
self
|
56
|
+
end
|
57
|
+
|
58
|
+
##
|
59
|
+
# Returns the value as a string.
|
60
|
+
#
|
61
|
+
# @return [String]
|
62
|
+
def to_s
|
63
|
+
@string
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def parse_value(value, options)
|
69
|
+
ns_hash = {}
|
70
|
+
options[:namespaces].each_pair do |prefix, uri|
|
71
|
+
prefix = prefix.to_s
|
72
|
+
attr = prefix.empty? ? "xmlns" : "xmlns:#{prefix}"
|
73
|
+
ns_hash[attr] = uri.to_s
|
74
|
+
end
|
75
|
+
|
76
|
+
case @library
|
77
|
+
when :nokogiri then parse_value_nokogiri(value, ns_hash, options)
|
78
|
+
when :libxml then parse_value_libxml(value, ns_hash, options)
|
79
|
+
when :rexml then parse_value_rexml(value, ns_hash, options)
|
80
|
+
else value.to_s
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def serialize_nodeset(object)
|
85
|
+
case @library
|
86
|
+
when :nokogiri then serialize_nodeset_nokogiri(object)
|
87
|
+
when :libxml then serialize_nodeset_libxml(object)
|
88
|
+
when :rexml then serialize_nodeset_rexml(object)
|
89
|
+
else object
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
# Nokogiri implementations
|
94
|
+
if defined?(::Nokogiri)
|
95
|
+
# A somewhat half-hearted attempt at C14N.
|
96
|
+
# Main problem is that it promotes all namespaces to top element, instead of demoting them
|
97
|
+
# to the required element, and does not properly order either namespaces or attributes.
|
98
|
+
#
|
99
|
+
# An open-issue in Nokogiri is to add support for C14N from the underlying libxml2 libraries.
|
100
|
+
def parse_value_nokogiri(value, ns_hash, options)
|
101
|
+
elements = if value.is_a?(Nokogiri::XML::NodeSet)
|
102
|
+
value
|
103
|
+
else
|
104
|
+
ns_strs = []
|
105
|
+
ns_hash.each_pair {|a, u| ns_strs << "#{a}=\"#{u}\""}
|
106
|
+
# Add inherited namespaces to created root element so that they're inherited to sub-elements
|
107
|
+
Nokogiri::XML::Document.parse("<foo #{ns_strs.join(" ")}>#{value.to_s}</foo>").root.children
|
108
|
+
end
|
109
|
+
|
110
|
+
elements.map do |c|
|
111
|
+
if c.is_a?(Nokogiri::XML::Element)
|
112
|
+
c = Nokogiri::XML.parse(c.dup.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::NO_EMPTY_TAGS)).root
|
113
|
+
|
114
|
+
# Apply defined namespaces
|
115
|
+
ns_hash.each_pair do |prefix, href|
|
116
|
+
c[prefix] = href unless c.namespaces[prefix]
|
117
|
+
end
|
118
|
+
|
119
|
+
# Add language
|
120
|
+
if options[:language] && c["lang"].to_s.empty?
|
121
|
+
c["xml:lang"] = options[:language].to_s
|
122
|
+
end
|
123
|
+
end
|
124
|
+
c
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def serialize_nodeset_nokogiri(object)
|
129
|
+
object.map {|c| c.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::NO_EMPTY_TAGS)}.join("")
|
130
|
+
end
|
131
|
+
end # Nokogiri
|
132
|
+
|
133
|
+
if defined?(::LibXML)
|
134
|
+
# This should use Document#canonicalize if as and when it is available in libxml-ruby
|
135
|
+
def parse_value_libxml(value, ns_strs, language)
|
136
|
+
# Fixme
|
137
|
+
end
|
138
|
+
|
139
|
+
def serialize_nodeset_libxml(object)
|
140
|
+
# Fixme
|
141
|
+
end
|
142
|
+
end # LibXML
|
143
|
+
|
144
|
+
# REXML
|
145
|
+
# This could make use of the XMLCanonicalizer gem (http://rubygems.org/gems/XMLCanonicalizer)
|
146
|
+
# But, it hasn't been touched since 2007 and relies on log4r.
|
147
|
+
def parse_value_rexml(value, ns_strs, language)
|
148
|
+
# Fixme
|
149
|
+
end
|
150
|
+
|
151
|
+
def serialize_nodeset_rexml(object)
|
152
|
+
# Fixme
|
153
|
+
end
|
154
|
+
|
155
|
+
end # class XML
|
156
|
+
end; end
|