Class: Canon::TreeDiff::Adapters::XMLAdapter

Inherits:
Object
  • Object
show all
Defined in:
lib/canon/tree_diff/adapters/xml_adapter.rb

Overview

XMLAdapter converts Nokogiri XML documents to TreeNode structures and back, enabling semantic tree diffing on XML documents.

This adapter:

  • Converts Nokogiri::XML::Document to TreeNode tree

  • Preserves element names, text content, and attributes

  • Handles namespaces appropriately

  • Maintains document structure for round-trip conversion

Examples:

Convert XML to TreeNode

xml = Nokogiri::XML("<root><child>text</child></root>")
adapter = XMLAdapter.new
tree = adapter.to_tree(xml)

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(match_options: {}) ⇒ XMLAdapter

Initialize adapter with match options

Parameters:

  • match_options (Hash) (defaults to: {})

    Match options for text/attribute normalization



28
29
30
# File 'lib/canon/tree_diff/adapters/xml_adapter.rb', line 28

def initialize(match_options: {})
  @match_options = match_options
end

Instance Attribute Details

#match_optionsObject (readonly)

Returns the value of attribute match_options.



23
24
25
# File 'lib/canon/tree_diff/adapters/xml_adapter.rb', line 23

def match_options
  @match_options
end

Instance Method Details

#from_tree(tree_node, doc = nil) ⇒ Nokogiri::XML::Document, Nokogiri::XML::Element

Convert TreeNode back to Nokogiri XML

Parameters:

  • tree_node (Core::TreeNode)

    Root tree node

  • doc (Nokogiri::XML::Document) (defaults to: nil)

    Optional document to use

Returns:

  • (Nokogiri::XML::Document, Nokogiri::XML::Element)


72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/canon/tree_diff/adapters/xml_adapter.rb', line 72

def from_tree(tree_node, doc = nil)
  doc ||= Nokogiri::XML::Document.new

  element = build_element(tree_node, doc)

  if doc.root.nil?
    doc.root = element
    doc
  else
    element
  end
end

#to_tree(node) ⇒ Core::TreeNode

Convert Nokogiri XML document/element or Canon::Xml::Node to TreeNode

Parameters:

  • node (Nokogiri::XML::Document, Nokogiri::XML::Element, Canon::Xml::Node)

    XML node

Returns:



36
37
38
39
40
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
# File 'lib/canon/tree_diff/adapters/xml_adapter.rb', line 36

def to_tree(node)
  # Handle nil nodes
  return nil if node.nil?

  # Handle Canon::Xml::Node types first
  case node
  when Canon::Xml::Nodes::RootNode
    return to_tree_from_canon_root(node)
  when Canon::Xml::Nodes::ElementNode
    return to_tree_from_canon_element(node)
  when Canon::Xml::Nodes::TextNode
    return to_tree_from_canon_text(node)
  when Canon::Xml::Nodes::CommentNode
    return to_tree_from_canon_comment(node)
  end

  # Fallback to Nokogiri (legacy support)
  case node
  when Nokogiri::XML::Document
    # Start from root element
    root = node.root
    raise ArgumentError, "Document has no root element" if root.nil?

    to_tree(root)
  when Nokogiri::XML::Element
    convert_element(node)
  else
    raise ArgumentError, "Unsupported node type: #{node.class}"
  end
end