- npm updates + xml2js install
- notes for xml2js - query oai datsets via oai endpoint
This commit is contained in:
parent
745c3e1349
commit
c86f0f44eb
6 changed files with 346 additions and 182 deletions
|
@ -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;
|
||||
|
|
Loading…
Add table
editor.link_modal.header
Reference in a new issue