using ODMXMLTools;

path = joinpath(dirname(pathof(ODMXMLTools)), "..", "test")

Load ODM-XML

ODMXMLTools.jl doesn't check correctness of *.xml file.

using ODMXMLTools;

# Load XML file

odm = ODMXMLTools.importxml(joinpath(path, "test.xml"))
ODM root node

Then you can get MetaDataVersion list, Study list, ClinicalData list and other.

# Get metadata list
ODMXMLTools.metadatalist(odm)
4×3 DataFrame
RowStudyOIDOIDName
StringStringString
1TEMPLATE_ST_01mvd_tpl_1Tpl_Version_v1
2ST_1_1mdv_1Version_v1
3ST_2_1mdv_1Version_v1
4ST_2_1mdv_2Version_v2
# Get study list
ODMXMLTools.studylist(odm)
3×1 DataFrame
RowStudyOID
String
1TEMPLATE_ST_01
2ST_1_1
3ST_2_1
# Get clinical data list
ODMXMLTools.clinicaldatalist(odm)
3×2 DataFrame
RowStudyOIDMetaDataVersionOID
StringString
1ST_1_1mdv_1
2ST_2_1mdv_1
3ST_2_1mdv_2

Build metadata

# Build metadata
mdb = ODMXMLTools.buildmetadata(odm, "ST_2_1", "mdv_2")
Completed Study MetaData (18 elements), OID: mdv_2, Name: Version_v2

Find clinical data and get observation data

# Find clinical data
cdat = ODMXMLTools.findclinicaldata(odm, "ST_2_1", "mdv_2")
ClinicalData  ( StudyOID:ST_2_1))
# Get clinical data
ODMXMLTools.clinicaldatatable(cdat)
14×7 DataFrame
RowSubjectKeyStudyEventOIDFormOIDItemGroupOIDItemGroupRepeatKeyItemOIDValue
StringStringStringStringString?StringString
1003SE_VIZIT1FORM_DEAN_1DE_IG_1missingDE_11
2003SE_VIZIT1FORM_DEAN_1DE_IG_1missingDE_249
3003SE_VIZIT1FORM_DEAN_1DE_IG_1missingDE_32
4003SE_VIZIT1FORM_DEAN_1AN_IG_2missingAN_1170
5003SE_VIZIT1FORM_VD_1VIT_IG_1missingI_1119
6003SE_VIZIT1FORM_VD_1VIT_IG_1missingI_285
7003SE_VIZIT1FORM_VD_1VIT_IG_1missingI_363
8004SE_VIZIT1FORM_DEAN_1DE_IG_1missingDE_12
9004SE_VIZIT1FORM_DEAN_1DE_IG_1missingDE_252
10004SE_VIZIT1FORM_DEAN_1DE_IG_1missingDE_31
11004SE_VIZIT1FORM_DEAN_1AN_IG_2missingAN_1170
12004SE_VIZIT1FORM_VD_1VIT_IG_1missingI_1120
13004SE_VIZIT1FORM_VD_1VIT_IG_1missingI_285
14004SE_VIZIT1FORM_VD_1VIT_IG_1missingI_360

Get tables

# Find study
st1 =  ODMXMLTools.findstudy(odm, "ST_2_1")
Study  (OID:ST_2_1))
# Find element
ODMXMLTools.findelement(st1, :MetaDataVersion, "mdv_2")
MetaDataVersion  (OID:mdv_2))
# Event list
ODMXMLTools.eventlist(mdb)
1×4 DataFrame
RowOIDNameRepeatingType
String?String?String?String?
1SE_VIZIT1Vizit 1NoScheduled
# Form list
ODMXMLTools.formlist(mdb)
2×3 DataFrame
RowOIDNameRepeating
String?String?String?
1FORM_DEAN_1Demographic and antropometricNo
2FORM_VD_1Vital dataNo
# ItemGroup list
ODMXMLTools.itemgrouplist(mdb)
3×3 DataFrame
RowOIDNameRepeating
String?String?String?
1DE_IG_1DemographicNo
2AN_IG_2AntropometricNo
3VIT_IG_1Vital dataNo
# Item list
ODMXMLTools.itemlist(mdb)
7×3 DataFrame
RowOIDNameDataType
String?String?String?
1DE_1Sexinteger
2I_3HRinteger
3DE_2Ageinteger
4DE_3Raceinteger
5AN_1Heightinteger
6I_1SADinteger
7I_2DADinteger

Also

# Subject data
ODMXMLTools.subjectdatatable(odm; attrs = [:SubjectKey, :StudySubjectID])
6×2 DataFrame
RowSubjectKeyStudySubjectID
String?String?
1001missing
2002missing
3001missing
4002missing
5003missing
6004missing
# Study information
ODMXMLTools.studyinfo(odm)
--------------------------------------
Study OID: TEMPLATE_ST_01
StudyName: Template 1
StudyDescription: This is basic form template
ProtocolName: Template
MetaDataVersion:
    OID: mvd_tpl_1; Name: Tpl_Version_v1
--------------------------------------
Study OID: ST_1_1
StudyName: Study 1
StudyDescription: Study 1 Description
ProtocolName: Protocol Number
MetaDataVersion:
    OID: mdv_1; Name: Version_v1
--------------------------------------
Study OID: ST_2_1
StudyName: Study 2
StudyDescription: Study 2 Description
ProtocolName: Protocol Number Study 2
MetaDataVersion:
    OID: mdv_1; Name: Version_v1
    OID: mdv_2; Name: Version_v2
--------------------------------------

Validation

# Basic validation
ODMXMLTools.validateodm(odm)
ODMXML log: 0 item(s). Info = 0, Warnings = 0, Errors = 0, skipped 0 node(s).
# Data validation
ODMXMLTools.checkdatavalues(odm)
Any[]

SPSS features

# Value labesl
ODMXMLTools.spss_form_value_labels(mdb, "FORM_DEAN_1"; variable = :OID)
VALUE LABELS
DE_1
1 'Male'
2 'Female'/
DE_3
1 'Asian'
2 'Caucasian'.
# Variable labels
ODMXMLTools.spss_form_variable_labels(mdb, "FORM_DEAN_1"; variable = :SASFieldName)
VARIABLE LABELS
DE_1 'Sex'
DE_2 'Age'
DE_3 'Race'
AN_1 'Height'.
# Event value labels
ODMXMLTools.spss_events_value_labels(mdb; variable = "StudyEventOID", value = :OID, label = :Name)
VALUE LABELS
StudyEventOID
'SE_VIZIT1' 'Vizit 1'.