parseString не определено в angular 6 с использованием xml2js - PullRequest
0 голосов
/ 29 октября 2018

Я не могу заставить код 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 Ответ

0 голосов
/ 29 октября 2018

Измените свой импорт в классе CgetterComponent на:

import xml2js from 'xml2js';

Или:

import * as xml2js from 'xml2js';

Если вы изучите файл xml2js , который упоминается как файл main в package.json проекта. Он экспортирует объект с различными свойствами, такими как Builder, Parser и parseString, ни одно из которых не имеет имени / идентификатора xml2js. Таким образом, с именем import , который вы используете import { xml2js } from 'xml2js';, пытается указать несуществующее свойство объекта (log 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);
  }
});

Вот пример импорта / использования в действии.

Надеюсь, это поможет!

...