【问题标题】:How to parse xml in Angular 2如何在 Angular 2 中解析 xml
【发布时间】:2016-04-02 02:09:16
【问题描述】:

我正在使用一个使用 XML 而不是 JSON 的 API。有关如何将以下 XML 转换为 JSON 或如何正确使用 ngFor 指令中的数据的任何建议?

另外,observable 在这里合适吗?

<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>

【问题讨论】:

  • 那里有几个 xml 到 json 库
  • @juvian 我欢迎推荐。我不知道 Angular 2 有什么。
  • 不需要angular2,它与组件或任何角度相关的东西都没有关系,只需将xml转换为json,然后使用angular:stackoverflow.com/questions/1773550/…

标签: xml angular typescript observable


【解决方案1】:

基于库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");
}

看到这个问题:

看到这个 plunkr:https://plnkr.co/edit/dj63ASQAgrNcLLlwyAum?p=preview

【讨论】:

  • 谢谢,我试试看。不过,出于某种原因,plunkr 不适合我。
  • 你是什么意思?事实上你需要点击“测试”标签;-)
  • 当我点击“测试”标签时,没有任何反应。 DevTools 控制台显示错误:GET https://angular2.apispark.net/v1/companies/ 401 (Unauthorized)
  • 它对我有用...getCompanies 方法中有this.createAuthorizationHeader(headers); 行吗?您有凭据...
  • 我知道这是旧的,但我得到“找不到名称 xml2json”
【解决方案2】:

我宁愿使用 npm 模块而不是 Javascript,因为

  1. 这是 TypeScript 而不是 JavaScript
  2. 虽然提供此服务可以工作,但在进行构建或分发时它不会工作,因为它会给出错误 xml2json is not defined 因为它仅在 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'));

【讨论】:

  • 能不能写出this.getJSON方法和error.json的实现
【解决方案3】:

如果您正在使用 POST 并获取 XML 响应: 使用 xml2js - https://www.npmjs.com/package/xml2js

  1. npm install 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);              
          });
    }
    

【讨论】:

  • 这个包需要 webpack
猜你喜欢
  • 2017-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-02
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多