lib/attribute_handler.ex

defmodule AttributeHandler do
  @behaviour Saxy.Handler

  def handle_event(:start_element, {name, _attributes}, state) do
    {:ok, %{state | name: name}}
  end

  def handle_event(:end_element, _name, state) do
    {:ok, %{state | name: nil}}
  end

  @names ~w(
    cp:keywords
    dc:description
    dc:subject
    dc:title
  )

  def handle_event(:characters, chars, %{name: name, texts: texts} = state) when name in @names do
    {:ok, %{state | texts: [chars | texts]}}
  end

  def handle_event(:cdata, chars, %{name: name, texts: texts} = state) when name in @names do
    {:ok, %{state | texts: [chars | texts]}}
  end

  def handle_event(_, _, state) do
    {:ok, state}
  end
end