libxml-jruby 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +4 -0
- data/README.txt +50 -0
- data/Rakefile +19 -0
- data/VERSION +1 -0
- data/VERSION.yml +5 -0
- data/lib/libxml-jruby.rb +84 -0
- data/lib/libxml-jruby/xml.rb +1 -0
- data/lib/libxml-jruby/xml/attr.rb +46 -0
- data/lib/libxml-jruby/xml/attributes.rb +68 -0
- data/lib/libxml-jruby/xml/document.rb +52 -0
- data/lib/libxml-jruby/xml/dtd.rb +25 -0
- data/lib/libxml-jruby/xml/node.rb +285 -0
- data/lib/libxml-jruby/xml/ns.rb +19 -0
- data/lib/libxml-jruby/xml/parser.rb +121 -0
- data/lib/libxml-jruby/xml/xpath.rb +98 -0
- data/lib/libxml.rb +1 -0
- data/lib/xml.rb +13 -0
- data/lib/xml/libxml.rb +8 -0
- data/test/etc_doc_to_s.rb +19 -0
- data/test/ets_copy_bug.rb +21 -0
- data/test/ets_copy_bug3.rb +38 -0
- data/test/ets_doc_file.rb +15 -0
- data/test/ets_doc_to_s.rb +21 -0
- data/test/ets_gpx.rb +26 -0
- data/test/ets_node_gc.rb +21 -0
- data/test/ets_tsr.rb +9 -0
- data/test/model/default_validation_bug.rb +0 -0
- data/test/tc_attributes.rb +110 -0
- data/test/tc_deprecated_require.rb +13 -0
- data/test/tc_document.rb +97 -0
- data/test/tc_document_write.rb +139 -0
- data/test/tc_dtd.rb +70 -0
- data/test/tc_html_parser.rb +63 -0
- data/test/tc_node.rb +108 -0
- data/test/tc_node_attr.rb +176 -0
- data/test/tc_node_cdata.rb +51 -0
- data/test/tc_node_comment.rb +32 -0
- data/test/tc_node_copy.rb +40 -0
- data/test/tc_node_edit.rb +98 -0
- data/test/tc_node_set.rb +24 -0
- data/test/tc_node_set2.rb +37 -0
- data/test/tc_node_text.rb +17 -0
- data/test/tc_node_xlink.rb +28 -0
- data/test/tc_ns.rb +18 -0
- data/test/tc_parser.rb +308 -0
- data/test/tc_parser_context.rb +126 -0
- data/test/tc_properties.rb +37 -0
- data/test/tc_reader.rb +112 -0
- data/test/tc_relaxng.rb +39 -0
- data/test/tc_sax_parser.rb +113 -0
- data/test/tc_schema.rb +39 -0
- data/test/tc_traversal.rb +220 -0
- data/test/tc_well_formed.rb +11 -0
- data/test/tc_xinclude.rb +26 -0
- data/test/tc_xpath.rb +130 -0
- data/test/tc_xpath_context.rb +72 -0
- data/test/tc_xpointer.rb +78 -0
- data/test/test_libxml-jruby.rb +0 -0
- data/test/test_suite.rb +31 -0
- data/test/ts_working.rb +31 -0
- metadata +121 -0
@@ -0,0 +1,19 @@
|
|
1
|
+
module LibXMLJRuby
|
2
|
+
module XML
|
3
|
+
class NS
|
4
|
+
class << self
|
5
|
+
def from_java(java_obj)
|
6
|
+
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(node, href, prefix)
|
11
|
+
@node, @href, @prefix = node, href, prefix
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_reader :href, :prefix
|
15
|
+
def href?; !!href; end
|
16
|
+
def prefix?; !!prefix; end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
class LibXMLJRuby::XML::Parser
|
2
|
+
class ParseError < RuntimeError; end
|
3
|
+
|
4
|
+
VERNUM = 0
|
5
|
+
VERSION = '0'
|
6
|
+
|
7
|
+
@default_tree_indent_string = ' '
|
8
|
+
@check_lib_versions = ''
|
9
|
+
@features = []
|
10
|
+
|
11
|
+
class << self
|
12
|
+
attr_accessor :debug_entities, :default_compression,
|
13
|
+
:default_keep_blanks, :default_line_numbers,
|
14
|
+
:default_substitute_entities,
|
15
|
+
:default_tree_indent_string,
|
16
|
+
:default_validity_checking, :default_warnings,
|
17
|
+
:features, :indent_tree_output,
|
18
|
+
:check_lib_versions
|
19
|
+
|
20
|
+
def register_error_handler(handler = nil, &block)
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
def file(filename)
|
25
|
+
p = new
|
26
|
+
p.filename = filename
|
27
|
+
p
|
28
|
+
end
|
29
|
+
|
30
|
+
def string(string)
|
31
|
+
p = new
|
32
|
+
p.string = string
|
33
|
+
p
|
34
|
+
end
|
35
|
+
|
36
|
+
def io(io)
|
37
|
+
p = new
|
38
|
+
p.io = io
|
39
|
+
p
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def initialize
|
44
|
+
@source_type = nil
|
45
|
+
@parsed = false
|
46
|
+
end
|
47
|
+
|
48
|
+
attr_reader :string, :filename, :io
|
49
|
+
|
50
|
+
def string=(string = nil)
|
51
|
+
raise TypeError if string.nil?
|
52
|
+
@parsed = false
|
53
|
+
@source_type = String
|
54
|
+
@string = string
|
55
|
+
end
|
56
|
+
|
57
|
+
def filename=(filename)
|
58
|
+
@source_type = File
|
59
|
+
@filename = filename
|
60
|
+
end
|
61
|
+
|
62
|
+
def io=(io)
|
63
|
+
raise TypeError if StringIO === io
|
64
|
+
@io = io
|
65
|
+
self.string = @io.read
|
66
|
+
end
|
67
|
+
|
68
|
+
def parse
|
69
|
+
raise ParseError, "You cannot parse twice" if @parsed
|
70
|
+
raise ParseError, "No input specified, please specify an input" unless @source_type
|
71
|
+
doc = send("parse_#{@source_type.to_s.downcase}")
|
72
|
+
@parsed = true
|
73
|
+
doc
|
74
|
+
end
|
75
|
+
|
76
|
+
def document_builder_factory
|
77
|
+
@dbf ||= DocumentBuilderFactory.new_instance
|
78
|
+
end
|
79
|
+
|
80
|
+
def document_builder
|
81
|
+
document_builder_factory.namespace_aware = true
|
82
|
+
document_builder_factory.new_document_builder
|
83
|
+
end
|
84
|
+
|
85
|
+
def string_reader
|
86
|
+
StringReader.new(@string)
|
87
|
+
end
|
88
|
+
|
89
|
+
def input_source
|
90
|
+
InputSource.new(string_reader)
|
91
|
+
end
|
92
|
+
|
93
|
+
def parse_string
|
94
|
+
raise ParseError if @string.empty?
|
95
|
+
builder = document_builder
|
96
|
+
|
97
|
+
begin
|
98
|
+
jdoc = builder.parse(input_source)
|
99
|
+
rescue NativeException
|
100
|
+
raise ParseError
|
101
|
+
end
|
102
|
+
|
103
|
+
XML::Document.from_java(jdoc)
|
104
|
+
end
|
105
|
+
|
106
|
+
def parse_file
|
107
|
+
builder = document_builder
|
108
|
+
|
109
|
+
begin
|
110
|
+
jdoc = builder.parse(@filename)
|
111
|
+
rescue
|
112
|
+
raise ParseError
|
113
|
+
end
|
114
|
+
|
115
|
+
XML::Document.from_java(jdoc)
|
116
|
+
end
|
117
|
+
|
118
|
+
def parse_io
|
119
|
+
parse_string
|
120
|
+
end
|
121
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module LibXMLJRuby
|
2
|
+
module XML
|
3
|
+
module XPath
|
4
|
+
NODESET = nil
|
5
|
+
|
6
|
+
class Object
|
7
|
+
include Enumerable
|
8
|
+
|
9
|
+
def initialize(expr, document, nslist = nil)
|
10
|
+
@expr, @document = expr, document
|
11
|
+
@nslist = nslist
|
12
|
+
end
|
13
|
+
|
14
|
+
def each(&block)
|
15
|
+
set.each(&block)
|
16
|
+
end
|
17
|
+
|
18
|
+
def length
|
19
|
+
set.length
|
20
|
+
end
|
21
|
+
|
22
|
+
def first
|
23
|
+
set.first
|
24
|
+
end
|
25
|
+
|
26
|
+
def xpath_type
|
27
|
+
XML::XPath::NODESET
|
28
|
+
end
|
29
|
+
|
30
|
+
def set
|
31
|
+
@set ||= XML::Node::Set.from_java(evaluate_expression)
|
32
|
+
end
|
33
|
+
|
34
|
+
def [](index)
|
35
|
+
set[index]
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
def xpath_factory
|
40
|
+
@xpath_factory ||= XPathFactory.new_instance
|
41
|
+
end
|
42
|
+
|
43
|
+
def xpath
|
44
|
+
@xpath ||= xpath_factory.newXPath
|
45
|
+
end
|
46
|
+
|
47
|
+
def resolver
|
48
|
+
PrefixResolverDefault.new(doc_element)
|
49
|
+
end
|
50
|
+
|
51
|
+
def doc_element
|
52
|
+
if document.respond_to?(:getDocumentElement)
|
53
|
+
document.getDocumentElement
|
54
|
+
elsif document.respond_to?(:getOwnerDocument)
|
55
|
+
document.getOwnerDocument
|
56
|
+
else
|
57
|
+
nil
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def namespace_context
|
62
|
+
CustomNamespaceContext.new(resolver)
|
63
|
+
end
|
64
|
+
|
65
|
+
def evaluate_expression
|
66
|
+
xpath.setNamespaceContext(namespace_context)
|
67
|
+
xpath.evaluate(@expr, document, XPathConstants::NODESET)
|
68
|
+
end
|
69
|
+
|
70
|
+
def document
|
71
|
+
@document.respond_to?(:java_obj) ? @document.java_obj : @document
|
72
|
+
end
|
73
|
+
|
74
|
+
class CustomNamespaceContext
|
75
|
+
include javax.xml.namespace.NamespaceContext
|
76
|
+
|
77
|
+
attr_reader :resolver
|
78
|
+
|
79
|
+
def initialize(resolver)
|
80
|
+
@resolver = resolver
|
81
|
+
end
|
82
|
+
|
83
|
+
def getNamespaceURI(prefix)
|
84
|
+
resolver.getNamespaceForPrefix(prefix)
|
85
|
+
end
|
86
|
+
|
87
|
+
def getPrefixes(val)
|
88
|
+
nil
|
89
|
+
end
|
90
|
+
|
91
|
+
def getPrefix(uri)
|
92
|
+
nil
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
data/lib/libxml.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'libxml-jruby'
|
data/lib/xml.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# This file loads libxml and adds the LibXML namespace
|
2
|
+
# to the toplevel for conveneience. The end result
|
3
|
+
# is to have XML:: universally exposed.
|
4
|
+
#
|
5
|
+
# It is recommend that you only load this file for libs
|
6
|
+
# that do not have their own namespace, eg. administrative
|
7
|
+
# scripts, personal programs, etc. For other applications
|
8
|
+
# require 'libxml' instead and include LibXML into your
|
9
|
+
# app/libs namespace.
|
10
|
+
|
11
|
+
require 'libxml'
|
12
|
+
|
13
|
+
include LibXML
|
data/lib/xml/libxml.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'xml'
|
2
|
+
|
3
|
+
1.times do |count|
|
4
|
+
|
5
|
+
xml_doc = XML::Document.new()
|
6
|
+
xml_doc.encoding = "UTF-8"
|
7
|
+
xml_doc.root = XML::Node.new("Request")
|
8
|
+
|
9
|
+
1000.times do |index|
|
10
|
+
xml_doc.root << node = XML::Node.new("row")
|
11
|
+
node["user_id"] = index.to_s
|
12
|
+
node << "600445"
|
13
|
+
end
|
14
|
+
|
15
|
+
xml_str = xml_doc.to_s
|
16
|
+
print "\r#{count}"
|
17
|
+
$stdout.flush
|
18
|
+
end
|
19
|
+
puts "\n"
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'xml'
|
2
|
+
|
3
|
+
def test( doc2 )
|
4
|
+
doc = XML::Document.new('1.0')
|
5
|
+
doc.root = XML::Node.new("ccc")
|
6
|
+
doc.root['aaa'] = 'aaa'
|
7
|
+
doc.root.child_add(doc2.root.copy(true)) # BUG!
|
8
|
+
doc.root << doc2.root.copy(true)
|
9
|
+
return doc
|
10
|
+
end
|
11
|
+
|
12
|
+
def test2
|
13
|
+
doc2 = XML::Document.new('1.0')
|
14
|
+
doc2.root = XML::Node.new("aaa")
|
15
|
+
test( doc2 )
|
16
|
+
end
|
17
|
+
|
18
|
+
1000.times { |i|
|
19
|
+
print "\r#{i}"; $stdout.flush
|
20
|
+
test2
|
21
|
+
}
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'xml'
|
2
|
+
|
3
|
+
str = <<-STR
|
4
|
+
<html>
|
5
|
+
<body>
|
6
|
+
<div class="textarea" id="t1"
|
7
|
+
style="STATIC">werwerwerwerwer </div>
|
8
|
+
<div class="textarea" id="t2" style="STATIC">
|
9
|
+
Quisque et diam dapibus nisi bibendum blandit.
|
10
|
+
</div>
|
11
|
+
<div class="textarea" id="t3" style="STATIC">
|
12
|
+
<p>aaaaaaaaa</p>
|
13
|
+
</div>
|
14
|
+
</body>
|
15
|
+
</html>
|
16
|
+
STR
|
17
|
+
|
18
|
+
XML::Parser.default_keep_blanks = false
|
19
|
+
xp = XML::Parser.new
|
20
|
+
xp.string = str
|
21
|
+
doc = xp.parse
|
22
|
+
|
23
|
+
xpath = "//div[@id='t1']"
|
24
|
+
div1 = doc.find(xpath).to_a[0]
|
25
|
+
printf "xxx div1: #{div1}\n"
|
26
|
+
|
27
|
+
xpath = "//div[@id='t2']"
|
28
|
+
div2 = doc.find(xpath).to_a[0]
|
29
|
+
printf "xxx div2: #{div2}\n"
|
30
|
+
|
31
|
+
|
32
|
+
div2.each do |child|
|
33
|
+
#c = child.clone
|
34
|
+
c = child.copy(false)
|
35
|
+
div1.child_add(c)
|
36
|
+
end
|
37
|
+
|
38
|
+
printf "xxx root: #{doc.root}\n"
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'xml'
|
2
|
+
|
3
|
+
# This is related to bug 8337, complaint is on amd64/fbsd
|
4
|
+
# unknown if it happens on other amd64/os combos
|
5
|
+
|
6
|
+
Process.setrlimit(Process::RLIMIT_NOFILE,10005)
|
7
|
+
|
8
|
+
(1..10000).each{|time|
|
9
|
+
XML::Document.file(File.join(File.dirname(__FILE__),'ets_test.xml'))
|
10
|
+
if time % 100 == 0
|
11
|
+
print "\r#{time}"
|
12
|
+
$stdout.flush
|
13
|
+
end
|
14
|
+
}
|
15
|
+
puts "\n"
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'xml'
|
2
|
+
|
3
|
+
100.times do |count|
|
4
|
+
|
5
|
+
xml_doc = XML::Document.new()
|
6
|
+
xml_doc.encoding = "UTF-8"
|
7
|
+
xml_doc.root = XML::Node.new("Request")
|
8
|
+
|
9
|
+
1000.times do |index|
|
10
|
+
|
11
|
+
xml_doc.root << node = XML::Node.new("row")
|
12
|
+
node["user_id"] = index.to_s
|
13
|
+
node << "600445"
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
xml_str = xml_doc.to_s
|
18
|
+
print "\r#{count}"
|
19
|
+
$stdout.flush
|
20
|
+
end
|
21
|
+
puts "\n"
|
data/test/ets_gpx.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'libxml'
|
2
|
+
|
3
|
+
100.times do
|
4
|
+
doc = XML::Document.new
|
5
|
+
doc.encoding = 'UTF-8'
|
6
|
+
|
7
|
+
root = XML::Node.new 'gpx'
|
8
|
+
root['version'] = '1.0'
|
9
|
+
root['creator'] = 'OpenStreetMap.org'
|
10
|
+
root['xmlns'] = "http://www.topografix.com/GPX/1/0/"
|
11
|
+
|
12
|
+
doc.root = root
|
13
|
+
|
14
|
+
track = XML::Node.new 'trk'
|
15
|
+
doc.root << track
|
16
|
+
|
17
|
+
trkseg = XML::Node.new 'trkseg'
|
18
|
+
track << trkseg
|
19
|
+
|
20
|
+
1.upto(1000) do |n|
|
21
|
+
trkpt = XML::Node.new 'trkpt'
|
22
|
+
trkpt['lat'] = n.to_s
|
23
|
+
trkpt['lon'] = n.to_s
|
24
|
+
trkseg << trkpt
|
25
|
+
end
|
26
|
+
end
|
data/test/ets_node_gc.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'xml'
|
2
|
+
|
3
|
+
# test of bug 13310, clears MEM2
|
4
|
+
|
5
|
+
include GC
|
6
|
+
|
7
|
+
inner = XML::Node.new('inner')
|
8
|
+
save = nil
|
9
|
+
1.times do
|
10
|
+
outer = XML::Node.new('outer')
|
11
|
+
outer.child = inner
|
12
|
+
1.times do
|
13
|
+
doc = XML::Document.new
|
14
|
+
doc.root = outer
|
15
|
+
# Uncomment the following line and it won't crash
|
16
|
+
save = doc
|
17
|
+
end
|
18
|
+
garbage_collect
|
19
|
+
end
|
20
|
+
garbage_collect
|
21
|
+
puts inner
|