Aunque ya tiene un rato que hice esto volvió a salir la necesidad de leer un rss en formato xml con angular así que aprovecho para poner cómo resolví esto de forma muy sencilla usando JS en un proyecto de angular.
¿como leer rss en xml con angular?
El punto más importante es conocer la siguiente función DOMParser() ya que con esto vamos a hacer la descomposición del archivo xml junto con este otro elemento parseFromString().
Para hacer estas llamadas necesitas hacerlo con XMLHttpRequest que es nativo de js, En caso de esta petición tenia que sacar una imagen que viene embebida en la descripción así que tuve que hacer un substring y como solo debía imprimir las 5 primeras noticias esta fijo en el for , en general debería funcionar con tu modelo.
pero para mayor entendimiento dejo un ejemplo a continuación
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class BienestarService {
constructor(private http: HttpClient) { }
//llamada principal
rssInfo(){
var req = new XMLHttpRequest();
req.open('GET', 'https://blog.tecsalud.mx/rss.xml', false);
req.send(null);
if (req.status == 200)
return this.convertXMLtoJSON (req.responseText);
}
//funcion que convierte xml a json
convertXMLtoJSON(xmltxt){
// Create the return object
var obj = {};
let xml = (new DOMParser()).parseFromString(xmltxt, "text/xml");
//modelo de mi front
let resp = {
title: '',
photo: '',
author: '',
create: '',
link: ''
}
let jsonarr = [];
//for que recorre los objetos del xml
for(let x = 0; x < 5; x ++){
//el xml de este blog trae item por cada articulo y dentro etiquetas del body
let y = xml.getElementsByTagName('item')[x].getElementsByTagName('description')[0].childNodes[0].nodeValue
let ini = y.search('src')
let fin = y.search('alt')
let sub = y.substring(ini + 5,fin - 2)
//ordenamos el xml al modelo
resp = {
title: xml.getElementsByTagName('item')[x].getElementsByTagName('title')[0].childNodes[0].nodeValue,
photo: sub,
author: xml.getElementsByTagName('item')[x].getElementsByTagName('dc:creator')[0].childNodes[0].nodeValue,
create: xml.getElementsByTagName('item')[x].getElementsByTagName('pubDate')[0].childNodes[0].nodeValue,
link: xml.getElementsByTagName('item')[x].getElementsByTagName('link')[0].childNodes[0].nodeValue
}
jsonarr.push(resp)
}
return jsonarr;
}
}
La ventaja de esta llamada es que hasta el día de hoy, esto no ha caducado al ser js nativo