1

我正在尝试将多个可观察对象合并在一起。一般来说,我正在尝试使用角度 httpClient 请求一个 xsd 文件并使用 xml2js 库对其进行解析。问题是这个 xsd 文件包含引用外部文件的导入语句。

所以我想做的是以下几点:

  1. 请求主 xsd 文件
  2. 解析主 xsd 文件(rxjs 映射运算符)
  3. 处理该文件中的所有导入语句
  4. 递归所有 1. 对于每个导入(使用 forkJoin 运算符合并这些)
  5. 将已解析的导入与已解析的主 xsd 文件合并

    this.http.get('<PATH to main xsd>')
      .pipe(map(data => {
        xml2js.parseString(data, (err, xmlObject) => {
          if (err) {
            console.error('ERROR', err);
          } else {
          data = xmlObject;
          }
        });
        return data;
      }))
      .pipe(mergeMap((data) => {
        if (xmlObject.xs_schema.xs_import !== undefined) {
          const requests: Observable<any>[] = [];
          for (const xmlImport of xmlObject.xs_schema.xs_import) {
            const path = 'xmlImport.path';
            requests.push(this.getXsdSchema(path));
          }
          return forkJoin(requests);
        } else {
          return empty();
        }
      }));
    

上面的代码一直有效,直到为导入的文件之一执行带有 mergeMap 的管道。我认为如果文件中没有导入,则返回一个空的 observable 可能是个问题。到目前为止,我无法弄清楚如何将导入包含在我的主要 xsd 对象中。

我尝试制作一个演示来显示当前状态和问题: https ://stackblitz.com/edit/angular-x26paa

4

0 回答 0