Module: Plist4r::Backend::Libxml4r

Defined in:
lib/plist4r/backend/libxml4r.rb

Class Methods

Overview

This backend uses Libxml4r / Libxml-Ruby to parse xml plists

Author:

Class Method Details

+ (Object) from_xml(plist)



87
88
89
90
91
92
# File 'lib/plist4r/backend/libxml4r.rb', line 87

def from_xml plist
  hash = parse_plist_xml plist.from_string
  plist.import_hash hash
  plist.file_format "xml"
  return plist
end

+ (Object) parse_plist_xml(string)



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/plist4r/backend/libxml4r.rb', line 68

def parse_plist_xml string
  ::LibXML::XML.default_keep_blanks = false
  doc = string.to_xmldoc
  doc.strip!

  root = doc.node["/plist/dict"]
  ordered_hash = nil
  if root
    ordered_hash = tree_hash root
  else
    root = doc.node["/plist/array"]
    if root
      ordered_hash = ::Plist4r::OrderedHash.new
      ordered_hash["Array"] = tree_array root
    end
  end
  ordered_hash
end

+ (Object) tree_array(n)



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/plist4r/backend/libxml4r.rb', line 41

def tree_array n
  array = []
  n.children.each do |node|
    case node.name
    when "true", "false"
      array << eval(node.name)
    when "string"
      array << node.inner_xml
    when "integer"
      array << node.inner_xml.to_i
    when "real"
      array << node.inner_xml.to_f
    when "date"
      array << Time.parse(node.inner_xml)
    when "data"
      bstr = bstr = Base64.decode64(node.inner_xml)
      bstr.blob = true
      array << bstr
    when "array"
      array << tree_array(node)
    when "dict"
      array << tree_hash(node)
    end
  end
  return array
end

+ (Object) tree_hash(n)



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/plist4r/backend/libxml4r.rb', line 11

def tree_hash n
  hash = ::Plist4r::OrderedHash.new
  n_xml_keys = n.nodes["key"]
  n_xml_keys.each do |n|
    k = n.inner_xml
    vnode = n.next
    case vnode.name
    when "true", "false"
      hash[k] = eval(vnode.name)
    when "string"
      hash[k] = vnode.inner_xml
    when "integer"
      hash[k] = vnode.inner_xml.to_i
    when "real"
      hash[k] = vnode.inner_xml.to_f
    when "date"
      hash[k] = Time.parse vnode.inner_xml
    when "data"
      bstr = Base64.decode64(vnode.inner_xml)
      bstr.blob = true
      hash[k] = bstr
    when "array"
      hash[k] = tree_array(vnode)
    when "dict"
      hash[k] = tree_hash(vnode)
    end
  end
  return hash
end