如何在 Angular 中解析 xml 2
How to parse xml in Angular 2
我正在使用 API,它使用 XML 而不是 JSON。关于如何将以下 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>
基于库 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");
}
看到这个问题:
- Parse XML using JavaScript
看到这个 plunkr:https://plnkr.co/edit/dj63ASQAgrNcLLlwyAum?p=preview。
我宁愿使用 npm 模块而不是 Javascript 因为
- 这是 TypeScript 而不是 JavaScript
- 在服务时这会起作用,但在构建或分发时它不会起作用,因为它会给出错误 xml2json is not defined as it is available only in javascript & Not in TS or at the time of转译。(发生在我的例子中)
我做了这样的事情。
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'));
如果您正在使用 POST 并返回 XML 响应:
使用 xml2js - https://www.npmjs.com/package/xml2js
- npm 安装 xml2js -g
在服务文件中导入为:
从 'xml2js';
导入 * 作为 xml2js
代码:
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);
});
}
我正在使用 API,它使用 XML 而不是 JSON。关于如何将以下 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>
基于库 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");
}
看到这个问题:
- Parse XML using JavaScript
看到这个 plunkr:https://plnkr.co/edit/dj63ASQAgrNcLLlwyAum?p=preview。
我宁愿使用 npm 模块而不是 Javascript 因为
- 这是 TypeScript 而不是 JavaScript
- 在服务时这会起作用,但在构建或分发时它不会起作用,因为它会给出错误 xml2json is not defined as it is available only in javascript & Not in TS or at the time of转译。(发生在我的例子中)
我做了这样的事情。
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'));
如果您正在使用 POST 并返回 XML 响应: 使用 xml2js - https://www.npmjs.com/package/xml2js
- npm 安装 xml2js -g
在服务文件中导入为: 从 'xml2js';
导入 * 作为 xml2js
代码:
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); }); }