Как разобрать xml в Angular 2

Я использую API, который использует XML вместо JSON. Любые предложения о том, как преобразовать следующий XML в JSON или как правильно использовать данные в директиве ngFor?

Кроме того, будет ли здесь уместна наблюдаемая?

<case-file>
  <serial-number>123456789</serial-number>
    <transaction-date>20150101</transaction-date>
      <case-file-header>
       <filing-date>20140101</filing-date>
      </case-file-header>
 // ...
   <classifications>
  <classification>
   <international-code-total-no>1</international-code-total-no>
   <primary-code>025</primary-code>
  </classification>
 </classifications>
 </case-file>
 <case-file>
     <serial-number>234567890</serial-number>
    <transaction-date>20160401</transaction-date>
      <case-file-header>
       <filing-date>20160401</filing-date>
      </case-file-header>
//...
   <classifications>
  <classification>
   <international-code-total-no>1</international-code-total-no>
   <primary-code>042</primary-code>
  </classification>
 </classifications>
</case-file>

export class apiService {
   constructor (private http: Http) {}

   private _apiUrl = 'app/api';  

   getCaseFile () {
     return this.http.get(this._apiUrl)
//conversion to JSON here?
                    .map(res => <CaseFile[]> res.json().data)
                     .catch(this.handleError);
   }
    private handleError (error: Response) {

     console.error(error);
    return Observable.throw(error.json().error || 'Server error');
   }
 }

<div *ngFor="#cf of case-file">{{case-file.serial-number}}</div>

person Ken    schedule 02.04.2016    source источник
comment
Существует несколько библиотек xml to json.   -  person juvian    schedule 02.04.2016
comment
@juvian Буду рад рекомендациям. Я не знаю ни одного для Angular 2.   -  person Ken    schedule 02.04.2016
comment
Нет необходимости в angular2, он не связан с компонентами или какими-либо вещами, связанными с angular, просто нужно преобразовать xml в json, а затем использовать angular с этим: stackoverflow.com/questions/1773550/   -  person juvian    schedule 02.04.2016


Ответы (3)


На основе библиотеки http://goessner.net/download/prj/jsonxml/ я реализовал образец для получения данных XML и их анализа в приложении Angular2:

var headers = new Headers();
(...)
headers.append('Accept', 'application/xml');

return this.http.get('https://angular2.apispark.net/v1/companies/', {
  headers: headers
}).map(res => JSON.parse(xml2json(res.text(),'  ')));

Чтобы иметь возможность использовать библиотеку, вам нужно сначала проанализировать строку XML:

var parseXml;

if (typeof window.DOMParser != "undefined") {
  parseXml = function(xmlStr) {
    return ( new window.DOMParser() ).parseFromString(xmlStr, "text/xml");
  };
} else if (typeof window.ActiveXObject != "undefined" &&
   new window.ActiveXObject("Microsoft.XMLDOM")) {
    parseXml = function(xmlStr) {
      var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM");
      xmlDoc.async = "false";
      xmlDoc.loadXML(xmlStr);
      return xmlDoc;
  };
} else {
  throw new Error("No XML parser found");
}

Смотрите этот вопрос:

См. этот планкр: https://plnkr.co/edit/dj63ASQAgrNcLLlwyAum?p=preview .

person Thierry Templier    schedule 02.04.2016
comment
Спасибо, я попробую. Однако по какой-то причине plunkr у меня не работает. - person Ken; 02.04.2016
comment
Что вы имеете в виду под какой-то причиной? На самом деле вам нужно нажать на тестовую метку ;-) - person Thierry Templier; 02.04.2016
comment
Когда я нажимаю на ярлык Test, ничего не происходит. Консоль DevTools показывает ошибку: GET https://angular2.apispark.net/v1/companies/ 401 (Unauthorized) - person Ken; 03.04.2016
comment
На моей стороне работает... У вас есть строка this.createAuthorizationHeader(headers); в методе getCompanies? У вас есть учетные данные в нем ... - person Thierry Templier; 03.04.2016
comment
Вы видите заголовок Authorization в запросе в консоли инструментов разработчика? - person Thierry Templier; 03.04.2016
comment
Кажется, теперь все работает. Я не уверен, должен ли это быть комментарий или новый вопрос о SO, но есть ли простой способ игнорировать префиксы xml? например, если это было <com: case-file>, а не просто <case-file>, могу ли я просто игнорировать префикс com? - person Ken; 05.04.2016
comment
Я знаю, что это старо, но я получаю Не могу найти имя xml2json - person nCore; 05.08.2016
comment
получение того же Не удается найти имя xml2json после добавления файла sml2json.js в проект. а также добавление пути к файлу в файле index.html. - person Nimish goel; 16.09.2017
comment
Почему этот ответ является решением? Работа с Angular не означает, что вы можете использовать ActiveXObject. Он не будет работать ни с каким другим навигатором, кроме Internet Explorer, верно? - person hugo; 12.07.2019

Я бы предпочел использовать модуль npm вместо Javascript, потому что

  1. Это TypeScript, а не JavaScript
  2. при обслуживании это будет работать, но при создании сборки или дистрибутива это не сработает, так как выдаст ошибку xml2json не определен, поскольку он доступен только в javascript, а не в TS или во время транспиляции. (произошло в моем случае)

Я сделал что-то вроде этого.

var parser = new xml2js.Parser({explicitArray : false});
//used xml2js parser from npm (https://www.npmjs.com/package/xml2js)
//and in my service i used this 
this.http.get(this.newsURL)
                .flatMap(res=>{
                        return Observable.fromPromise(this.getJSON(res.text()))
                })
                .catch((error:any) => Observable.throw(error.json().error || 'Server error'));
person Parth Ghiya    schedule 18.12.2016
comment
Можете написать реализацию метода this.getJSON и error.json - person Rajesh Jain; 20.09.2017

Это если вы используете POST и получаете ответ XML: используйте xml2js - https://www.npmjs.com/package/xml2js

  1. npm установить xml2js -g
  2. импортировать в служебный файл как: импортировать * как xml2js из 'xml2js';

  3. Код:

    let formdata = new URLSearchParams();
    formdata.set('username','username');
    formdata.set('pw','pw');
    
    let headers = new Headers({'Content-Type': 'application/x-www-form-urlencoded' });
    
    let options = new RequestOptions({ headers: headers, method: RequestMethod.Post});      
    
    postCaseFile () {
    
         this.http.post(this._apiUrl, formdata.toString(), options)
         //convert to JSON here
         .map(res => {
                    xml2js.parseString( res.text(), function (err, result) {
                    console.dir(result); // Prints JSON object!
               });
          }).subscribe(data => {    
            console.log(data);              
          });
    }
    
person Malick    schedule 03.05.2017