class EdifactConverter::XML112EDI::XmlReader

Attributes

edifact[RW]
handler[RW]
state[RW]

Public Class Methods

new() click to toggle source
# File lib/edifact_converter/xml112edi/xml_reader.rb, line 10
def initialize()
  self.edifact = EdiHandler.new
  self.handler = ChecksumHandler.new edifact
end

Public Instance Methods

parse(xmlstr, properties) click to toggle source
# File lib/edifact_converter/xml112edi/xml_reader.rb, line 15
def parse(xmlstr, properties)
  xml11 = if xmlstr.is_a? String
    Nokogiri::XML(xmlstr) { |config| config.nonet }
  else
    xmlstr
  end
  xml11.errors.each do |error|
    properties[:errors] << EdifactConverter::Message.from_syntax_error(error)
  end
  parse_xml xml11
end

Private Instance Methods

include_binaries(source) click to toggle source
# File lib/edifact_converter/xml112edi/xml_reader.rb, line 76
def include_binaries(source)
  return source if edifact.binary.empty?
  source.force_encoding 'ASCII-8BIT'
  edifact.binary.each do |id, base64|
    start = source.index(id)
    source[start, id.size] = Base64.decode64(base64)
  end
  source      
end
parse_xml(xmlsrc) click to toggle source
# File lib/edifact_converter/xml112edi/xml_reader.rb, line 29
def parse_xml(xmlsrc)
  xml = xmlsrc.dup
  return unless xml.root
  remove_grouping xml
  handler.startDocument
  xml.root.elements.each do |segment|
    handler.startSegment(segment.name)
    segment.elements.each do |element|
      handler.startElement()
      element.elements.each do |subelm|
        handler.value subelm.text
      end
      handler.endElement()
    end
    handler.endSegment()
  end
  handler.endDocument
  enc_converter = Encoding::Converter.new("utf-8", "iso-8859-1")
  edi_text = enc_converter.convert(edifact.edifact.string)
  include_binaries edi_text
end
remove_grouping(xml) click to toggle source
# File lib/edifact_converter/xml112edi/xml_reader.rb, line 51
def remove_grouping(xml)
  hidden, groups = [], []
  xml.root.traverse do |element|
    case element.name
    when /^[S][0-9]{2}$/
      if element['hidden']
        hidden << element
      else
        groups << element
      end
    when "Brev"
      hidden << element
    when "BrevIndhold"
      hidden << element
    end
  end
  hidden.each { |elm| elm.replace elm.elements }
  groups.each do |elm|
    first = elm.first_element_child
    first.unlink
    elm.next = elm.elements
    first.parent = elm
  end
end