# datacite-mapping
[![Build Status](https://travis-ci.org/CDLUC3/datacite-mapping.png?branch=master)](https://travis-ci.org/CDLUC3/datacite-mapping)
[![Code Climate](https://codeclimate.com/github/CDLUC3/datacite-mapping.png)](https://codeclimate.com/github/CDLUC3/datacite-mapping)
[![Inline docs](http://inch-ci.org/github/CDLUC3/datacite-mapping.png)](http://inch-ci.org/github/CDLUC3/datacite-mapping)
[![Gem Version](https://img.shields.io/gem/v/datacite-mapping.svg)](https://github.com/CDLUC3/datacite-mapping/releases)
A library for mapping [DataCite XML](http://schema.datacite.org/meta/kernel-4/) to Ruby objects,
based on [xml-mapping](http://multi-io.github.io/xml-mapping/) and
[xml-mapping_extensions](https://github.com/dmolesUC3/xml-mapping_extensions).
Full API documentation on [RubyDoc.info](http://www.rubydoc.info/github/CDLUC3/datacite-mapping/master/frames).
Supports [Datacite 4.0](https://schema.labs.datacite.org/meta/kernel-4.0/); backward-compatible with
[Datacite 3.1](https://schema.labs.datacite.org/meta/kernel-3/).
## Usage
The core of the Datacite::Mapping library is the `Resource` class, corresponding to the root `` element
in a Datacite document.
### Reading
To create a `Resource` object from XML file, use `Resource.parse_xml` or `Resource.load_from_file`,
depending on the data source:
| XML source | Method to use |
| ----------------- | ------------------------- |
| file path | `Resource.load_from_file` |
| `String` | `Resource.parse_xml` |
| `IO` | `Resource.parse_xml` |
| `REXML::Document` | `Resource.parse_xml` |
| `REXML::Element` | `Resource.parse_xml` |
Example:
```ruby
require 'datacite/mapping'
include Datacite::Mapping
resource = Resource.load_from_file('datacite-example-full-v4.0.xml')
# => # # "XML example of all DataCite Metadata Schema v4.0 properties."
```
Note that Datacite::Mapping uses the `TypesafeEnum` gem to represent controlled vocabularies such
as [ResourceTypeGeneral](http://www.rubydoc.info/github/CDLUC3/datacite-mapping/master/Datacite/Mapping/ResourceTypeGeneral)
and [DescriptionType](http://www.rubydoc.info/github/CDLUC3/datacite-mapping/master/Datacite/Mapping/DescriptionType).
### Writing
In general, a `Resource` object must be provided with all required attributes on initialization.
```ruby
resource = Resource.new(
identifier: Identifier.new(value: '10.5555/12345678'),
creators: [
Creator.new(
name: 'Josiah Carberry',
identifier: NameIdentifier.new(
scheme: 'ORCID',
scheme_uri: URI('http://orcid.org/'),
value: '0000-0002-1825-0097'
),
affiliations: [
'Department of Psychoceramics, Brown University'
]
)
],
titles: [
Title.new(value: 'Toward a Unified Theory of High-Energy Metaphysics: Silly String Theory')
],
publisher: 'Journal of Psychoceramics',
publication_year: 2008
)
# => # " " "