Ответ PierreDuc довольно крутой, потому что он создал проанализированное дерево XML.Мой другой подход, который похож на исходный код, за исключением того, что я использовал расширение, чтобы сделать рекурсивный вызов и в конце уменьшить данные до плоского массива, содержащего четыре элемента.Кстати, xml2js.parseString нужно обернуть в Observable
import { Component } from '@angular/core';
import { HttpHeaders, HttpClient } from '@angular/common/http';
import * as xml2js from 'xml2js';
import { Observable, forkJoin, empty, never, combineLatest, of, merge,zip ,concat} from 'rxjs';
import { switchMap, expand,mergeMap, map, catchError, tap,last ,scan,reduce} from 'rxjs/operators';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
name = 'Angular';
constructor(private http: HttpClient) {
this.getXsdSchema('/assets/main.xsd').subscribe((data) => {
console.log('data',data);
});
}
public getXsdSchema(path: string): Observable<any> {
return this.http.get(path, {
responseType: 'text',
headers: new HttpHeaders({
Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
})
})
.pipe(
mergeMap(data => {
let rtrn: any;
return new Observable(obs=>{
xml2js.parseString(data, {
explicitArray: false,
tagNameProcessors: [function (name) {
// replace ":" with "_" for all tag names to make sure that they can be accessed within javascript
return name.replace(/:/g, '_');
}]
}, (err, xmlObject) => {
if (err) {
obs.error(err)
} else {
obs.next(xmlObject)
obs.complete()
}
});
})
})
,expand((data)=>{
if (data.xs_schema&&data.xs_schema.xs_import !== undefined) {
const requests: Observable<any>[] = [];
if (data.xs_schema.xs_import instanceof Array) {
for (const xmlImport of data.xs_schema.xs_import) {
const localPath = `/assets/${xmlImport.$.schemaLocation}`;
requests.push(this.getXsdSchema(localPath));
//return this.getXsdSchema(localPath)
}
const forked = merge(...requests);
return forked;
} else {
const localPath = `/assets/${data.xs_schema.xs_import.$.schemaLocation}`;
return this.getXsdSchema(localPath);
}
}
return empty()
})
,reduce((acc,curr)=>acc.concat(curr),[])
)
}
}