使用xml2js在angular 6中未定义parseString

时间:2018-10-29 19:06:22

标签: json xml angular typescript xml2js

到目前为止,我无法使用angular 6来使xml2js代码正常工作。我有一个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 :(得分:1)

将您在CgetterComponent类中的导入更改为:

import xml2js from 'xml2js';

或者:

import * as xml2js from 'xml2js';

如果您检查xml2js文件,该文件在项目的main中被称为package.json文件。它导出具有各种属性的对象,例如BuilderParserparseString,它们都没有名称/标识符xml2js。因此,您正在使用import { xml2js } from 'xml2js';的{​​{3}}来尝试重要不存在的对象属性(在我共享的示例中查看日志xml2js以查看导出的属性),因此{{1} }。

您可以采用的另一种导入方法是使用命名导入直接导入您正在使用的undefined函数。看起来像:

parseString

然后您只需按以下方式使用它即可:

import { parseString } from 'xml2js';

这是实际导入/使用情况的named import

希望有帮助!