Skip to content

Instantly share code, notes, and snippets.

@lawlesst
Created September 15, 2011 12:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lawlesst/1219132 to your computer and use it in GitHub Desktop.
Save lawlesst/1219132 to your computer and use it in GitHub Desktop.
Sample METS update script using eulxml.
from eulxml import xmlmap
from eulxml.xmlmap import load_xmlobject_from_file
MODS_NAMESPACE = 'http://www.loc.gov/mods/v3'
METS_NAMESPACE = 'http://www.loc.gov/METS/'
SF = xmlmap.StringField
class Common(xmlmap.XmlObject):
"MODS class with namespace declaration common to all MODS XmlObjects."
ROOT_NS = METS_NAMESPACE
ROOT_NAME = 'METS'
ROOT_NAMESPACES = {'mods': MODS_NAMESPACE,
'METS': METS_NAMESPACE}
class Public(Common):
ROOT_NAME = 'rights:Context'
discover = SF('rights:Permissions/@DISCOVER')
display = SF('rights:Permissions/@DISPLAY')
modify = SF('rights:Permissions/@MODIFY')
class Rights(Common):
ROOT_NAME = 'RightsDeclarationMD'
public = xmlmap.NodeField('rights:Context[@CONTEXTCLASS="GENERAL PUBLIC"]', Public)
class Mods(Common):
"""Map mods fields."""
ROOT_NAME = 'mods'
language_code = xmlmap.StringField('mods:language/mods:languageTerm[@type="code"]')
class BDRMets(Common):
"""BDRMets class."""
pid = xmlmap.StringField('@OBJID')
mods = xmlmap.NodeField('//mods:mods', Mods)
#Get the METS as a file or string object.
handle = open('bdr7275.xml')
#Bind it to the classes.
mets = load_xmlobject_from_file(handle, BDRMets)
language_code = mets.mods.language_code
#Set code to english if it's italian.
if language_code == 'ita':
mets.mods.language_code = 'eng'
#METS now contains updated mods.
print mets.serialize(pretty=True)
#Update METS datastream with fcrepo.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment