代码之家  ›  专栏  ›  技术社区  ›  justTech

使用xml2js在angular 6中未定义parseString

  •  0
  • justTech  · 技术社区  · 6 年前

    到目前为止,我无法使用angular 6使xml2js代码正常工作。我有一个service.ts返回xml,但是当调用xml2js.parseString转换为json时,我始终得到一个未定义的错误。

    “core.js:1673 ERROR TypeError:无法读取未定义的属性'parseString'。” "

    服务.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
              }
            )
          )
      }
    }
    

    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运行到一个在线转换器,没有遇到任何问题。我不知道为什么函数返回undefined。

    还有一种方法可以验证xml2js中的所有文件是否正确加载?

    1 回复  |  直到 6 年前
        1
  •  4
  •   Alexander Staroselsky    6 年前

    在课堂上更改导入 CgetterComponent 收件人:

    import xml2js from 'xml2js';
    

    或:

    import * as xml2js from 'xml2js';
    

    xml2js 引用为 main 在项目的 package.json . 它导出具有各种属性的对象,例如 Builder Parser ,和 parseString ,它们都没有名称/标识符 xml2js . 所以 named import import { xml2js } from 'xml2js'; 正在尝试删除不存在的对象属性(日志 xml2js格式 undefined

    您可以采取的另一种导入方法是使用命名导入直接导入 解析字符串 正在使用的函数。这看起来像:

    import { parseString } from 'xml2js';
    

    然后你可以简单地使用它如下:

    parseString(data, { explicitArray: false }, (error, result) => {
      if (error) {
        throw new Error(error);
      } else {
        res = result;
        console.log(result);
      }
    });
    

    这是一个 example 实际的导入/使用。