- npm updates + xml2js install

- notes for xml2js
- query oai datsets via oai endpoint
This commit is contained in:
Arno Kaimbacher 2022-01-28 16:30:34 +01:00
parent 745c3e1349
commit c86f0f44eb
6 changed files with 346 additions and 182 deletions

View file

@ -6,8 +6,9 @@ import { SolrResponse } from "@/models/headers";
import { ActiveFilterCategories } from "@/models/solr";
import { VUE_APP_PORTAL } from "@/constants";
import { deserialize, instanceToInstance } from "class-transformer";
import { OAI_DATASETS } from "./mock-oai-datasets";
// import { OAI_DATASETS } from "./mock-oai-datasets";
import { OaiDataset } from "@/models/oai";
import xml2js from "xml2js";
class DatasetService {
// for the autocomplete search
@ -176,16 +177,123 @@ class DatasetService {
}
public getOAI(): Observable<OaiDataset[]> {
//const host = "https://resource.geolba.net/tethys/harvestOAI.php";
// const path = "/api/dataset/" + id;
// const apiUrl = host + path;
// const oaiDataset = api.get<any>(apiUrl);
const oaiDatasets = of(OAI_DATASETS);
const apiUrl = "https://data.tethys.at/oai?verb=ListRecords&metadataPrefix=oai_datacite";
const oaiDatasets = api.get<any>(apiUrl).pipe(
map(
(response: string) => {
// const arrOai = new Array<OaiDataset>();
// return arrOai;
const arrOai = this.parseXML(response);
return arrOai;
// .then((data) => {
// return data;
// });
},
// (error: string) => this.errorHandler(error),
),
);
// const oaiDatasets = of(OAI_DATASETS);
// this.messageService.add('HeroService: fetched heroes');
return oaiDatasets;
}
private parseXML(xmlStr: string): Array<OaiDataset> {
// let k = "";
const arr: OaiDataset[] = [];
const domParser = new DOMParser();
const doc = domParser.parseFromString(xmlStr, "application/xml");
const records = doc.getElementsByTagName("ListRecords")[0];
// // const rt = xmlNode.resumptionToken;
// for (let i = 0; i < records.length; i++) {
// console.log(records[i].getAttribute("name"));
// }
const parser = new xml2js.Parser({
trim: true,
explicitArray: false,
ignoreAttrs: false,
// mergeAttrs: true,
});
parser.parseString(records.outerHTML, function (err: any, result: any) {
const xmlNode = result.ListRecords;
// const rt = xmlNode.resumptionToken;
for (const rNode in xmlNode.record) {
const item = xmlNode.record[rNode];
const dc = item.metadata.resource;
const t = dc.titles.title;
const id = dc.identifier._;
const lang = "en"; //dc.titles.title.attributes("xml",True)->lang;
let title: string;
if (lang == "en" && t.length > 1) {
title = t[1]._;
} else {
title = t[0]._;
}
let creator = "";
if (dc.creators.creator instanceof Array) {
dc.creators.creator.forEach((person: any) => {
creator += person.creatorName._ + "; ";
});
} else {
creator += dc.creators.creator.creatorName._;
}
let contributor = "";
if (dc.contributors) {
if (dc.contributors.contributor instanceof Array) {
dc.contributors.contributor.forEach((person: any) => {
contributor += person.contributorName + "; ";
});
} else {
contributor += dc.contributors.contributor.contributorName;
}
}
// ?.map((u: any) => u.creatorName._).join("; ");
// foreach ($dc->creators->creator as $c) {
// foreach ($c->creatorName as $d) {
// if (count(explode(',',$d)) > 1) {
// $creator .= explode(',',$d)[0] . ', ' . substr(explode(',',$d)[1],1,1) . '; ';
// } else {
// $creator .= explode(',',$d)[0];
// }
// }
// }
const north = dc.geoLocations.geoLocation.geoLocationBox.northBoundLatitude;
const east = dc.geoLocations.geoLocation.geoLocationBox.eastBoundLongitude;
const south = dc.geoLocations.geoLocation.geoLocationBox.southBoundLatitude;
const west = dc.geoLocations.geoLocation.geoLocationBox.westBoundLongitude;
const subject = dc.subjects.subject.map((u: any) => u._).join(", ");
const oaiDataset = {
doi: id,
title: title,
creator: creator,
contributor: contributor,
subject: subject,
north: north,
south: south,
east: east,
west: west,
} as OaiDataset;
arr.push(oaiDataset);
}
// resolve(arr);
});
return arr;
}
// private prepareOAI(xml: any) : Array<OaiDataset> {
// //
// }
private prepareDataset(datasetObj: DbDataset, apiUrl: string): DbDataset {
const dataset = deserialize<DbDataset>(DbDataset, JSON.stringify(datasetObj));
dataset.url = document.documentURI;