Class: Lutaml::Lml::Executor::XmlAdapter

Inherits:
Object
  • Object
show all
Extended by:
AdapterHelpers
Defined in:
lib/lutaml/lml/executor/xml_adapter.rb

Overview

XML format adapter. Reads XML files and maps elements to hydrated compiled-class instances, and writes instances back to XML.

Registered for format “xml” via FormatAdapter::BUILTIN_ADAPTERS.

Element-to-attribute mapping is provided by the lutaml-model XML mapping generated on each compiled class by ModelCompiler. This adapter only selects which XML elements correspond to records (via the ‘where` XPath from the import definition) and hands each one to `target_class.from_xml` for deserialization.

Import shape (from LML ‘import { xml “…” { map_to X; where “/y” } }`):

- imp.file             = path to XML file
- imp.attributes       = TopElementAttribute list including:
    map_to: TargetClass (compiled-class key)
    where:  XPath selector for each record element

Export shape (from LML ‘export { format xml { file “…”; root “X” } }`):

- exp.attributes       = TopElementAttribute list including:
    file:      output path
    root:      root tag name (defaults to compiled class name)
    indent:    "true" / "false" (default true)
    encoding:  encoding string (default UTF-8)

Constant Summary collapse

DEFAULT_ENCODING =
"UTF-8"
DEFAULT_SELECTOR =
"/*/*"
DEFAULT_ROOT_SUFFIX =
"s"

Class Method Summary collapse

Methods included from AdapterHelpers

attribute_value, find_attribute, find_class_for_instance, resolve_target_class

Class Method Details

.export(exp, instances, compiled:) ⇒ Object

Write instances to an XML file.



60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/lutaml/lml/executor/xml_adapter.rb', line 60

def export(exp, instances, compiled:)
  return if instances.empty?

  path = attribute_value(exp.attributes, "file")
  return unless path && !path.empty?

  class_name, target_class = find_class_for_instance(instances.first, compiled)
  return unless target_class

  options = export_options(exp, class_name)
  File.write(path, build_export_xml(instances, options))
end

.import(imp, compiled:) ⇒ Object

Read an XML file and map elements to compiled-class instances. Returns an array of hydrated objects.



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/lutaml/lml/executor/xml_adapter.rb', line 41

def import(imp, compiled:)
  return [] unless imp.file
  return [] unless imp.attributes&.any?

  target_class = resolve_target_class(imp.attributes, compiled)
  return [] unless target_class

  path = imp.file
  return [] unless File.exist?(path)

  doc = Moxml.parse(File.read(path))
  selector = attribute_value(imp.attributes, "where") || DEFAULT_SELECTOR

  doc.xpath(selector).map do |element|
    target_class.from_xml(element.to_xml)
  end
end