parseString не определено в angular 6 с использованием xml2js
Я не могу заставить код xml2js работать до сих пор, используя angular 6. У меня есть service.ts, возвращающий xml, однако при вызове xml2js.parseString для преобразования в json я постоянно получаю неопределенную ошибку.
"core.js: 1673 ОШИБКА TypeError: Невозможно прочитать свойство 'parseString' из неопределенного"
service.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, of } from 'rxjs';
import { map, filter, catchError, mergeMap } from 'rxjs/operators';
import { HttpHeaders } from '@angular/common/http';
export interface Zid {
zpid: number;
}
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/x-www-form-urlencoded',
}),
responseType: 'text' as 'text'
};
@Injectable({
providedIn: 'root'
})
export class CdataServiceService {
constructor(private _http: HttpClient) { }
zipID = 'http://APiXml';
getZipID() {
return this._http.get(this.zipID, httpOptions)
.pipe
(map
(res =>
{
return res
}
)
)
}
}
component.ts
import { Component, OnInit } from '@angular/core';
import { CdataServiceService, Zid } from '../cdata-service.service';
import { xml2js } from 'xml2js';
import { Observable, of } from 'rxjs';
@Component({
selector: 'app-cgetter',
templateUrl: './cgetter.component.html',
styleUrls: ['./cgetter.component.css']
})
export class CgetterComponent implements OnInit {
data = [];
constructor(private cds: CdataServiceService) { }
onKeyCompGet(event:any){
console.log(event.target.value);
}
_zid :Zid
getTheComps(){
this.cds.getZipID()//cdataServiceService.getZipId()
.subscribe(
res => {
this.convertToJson(res);
})
}
public convertToJson(data: string): Object {
let res;
console.log(data);
xml2js.parseString(data, { explicitArray: false }, (error, result) => {
if (error) {
throw new Error(error);
} else {
res = result;
console.log(result);
}
});
return res;
}
ngOnInit() {
}
}
Я запустил возвращенный XML в онлайн-конвертер и не столкнулся с какими-либо проблемами. Я понятия не имею, почему функция возвращает неопределенное значение.
Также есть ли способ убедиться, что все файлы в xml2js загружаются правильно?
1 ответ
Изменить свой импорт в классе CgetterComponent
чтобы:
import xml2js from 'xml2js';
Или же:
import * as xml2js from 'xml2js';
Если вы изучите файл xml2js, который упоминается как main
файл в проекте package.json
, Экспортирует объект с различными свойствами, такими как Builder
, Parser
, а также parseString
ни у одного из них нет имени / идентификатора xml2js
, Таким образом, названный импорт, который вы используете import { xml2js } from 'xml2js';
пытается определить несуществующее свойство объекта (журнал xml2js
в примере, которым я поделился, чтобы увидеть экспортированные свойства), следовательно, undefined
,
Другой подход к импорту, который вы можете использовать, заключается в использовании именованного импорта для прямого импорта parseString
функция, которую вы используете. Это будет выглядеть так:
import { parseString } from 'xml2js';
И тогда вы просто используете его следующим образом:
parseString(data, { explicitArray: false }, (error, result) => {
if (error) {
throw new Error(error);
} else {
res = result;
console.log(result);
}
});
Вот пример импорта / использования в действии.
Надеюсь, это поможет!