SAP UI5 应用的 OData XML 格式的元数据请求解析原理,基于 DOMParser
2023-09-14 09:03:53 时间
前一篇文章SAP UI5 应用的 OData 元数据请求响应的解析原理分析我们介绍了 SAP UI5 OData 元数据解析的入口。本文继续介绍基于 DOMParser 的 XML 数据解析原理。
入口如下:
var xmlParse = function (text) {
/// <summary>Returns an XML DOM document from the specified text.</summary>
/// <param name="text" type="String">Document text.</param>
/// <returns>XML DOM document.</returns>
/// <remarks>This function will throw an exception in case of a parse error.</remarks>
var domParser = window.DOMParser && new window.DOMParser();
var dom;
if (!domParser) {
dom = msXmlParse(text);
if (!dom) {
xmlThrowParserError("XML DOM parser not supported");
}
return dom;
}
dom = domParser.parseFromString(text, “text/xml”); 这是一个原生方法调用。
成功解析出的 dom 元素对象:
下面开始遍历这个 dom 对象:
拿到第一个元素:
递归操作:
解析成功的 metadata:
解析出的 entityType:
解析成功的元数据,存储在 response.data 里:
触发 metadata 加载成功的 callback:
ODataMetadata.prototype._handleLoaded = function(oMetadata, mParams, bSuppressEvents) {
var aEntitySets = [];
this.oMetadata = this.oMetadata ? this.merge(this.oMetadata, oMetadata, aEntitySets) : oMetadata;
this.oRequestHandle = null;
mParams.entitySets = aEntitySets;
// resolve global promises
this.fnResolve(mParams);
if (this.bAsync && !bSuppressEvents) {
this.fireLoaded(this);
抛出 loaded 事件:
该事件的参数为 metadata 的 json 对象格式和 xml 文本:
OData 元数据就绪后,执行初始化操作:
ODataModel.prototype.initialize = function() {
// Call initialize on all bindings in case metadata was not available when they were created
var aBindings = this.getBindings();
aBindings.forEach(function(oBinding) {
oBinding.initialize();
});
};
遍历所有的 binding 数据源。
SAP UI5 使用的 datajs.js, 是一种开源的跨浏览器 JavaScript 程序库,可以让开发人员在浏览器环境里消费 OData 服务。
在 SAP UI5 库里位于路径 sap/ui/thirdparty 下面,SAP 对该文件也做了一些自己的修改,通过注释 BEGIN: MODIFIED BY SAP 和 END: MODIFIED BY SAP 来标识。
一个例子如下:
odata.defaultHandler = {
read: function (response, context) {
/// <summary>Reads the body of the specified response by delegating to JSON and ATOM handlers.</summary>
/// <param name="response">Response object.</param>
/// <param name="context">Operation context.</param>
// ##### BEGIN: MODIFIED BY SAP
// added response.body check and removed assigned(response.body) call...for the case that if body is empty string...don't process any response body data
if (response && response.body && response.headers["Content-Type"]) {
// ##### END: MODIFIED BY SAP
dispatchHandler("read", response, context);
}
},
更多Jerry的原创文章,尽在:“汪子熙”:
相关文章
- SAP UI5 应用中 MockServer 的实例化方法
- 关于 SAP UI5 所有控件的共同祖先 - sap.ui.base.ManagedObject
- SAP UI5 sap.ui.Device.media.RANGESETS.SAP_STANDARD_EXTENDED 介绍
- AOSP开源协议_open sap
- 【最佳实践】基于SAP业务腾讯云安装SUSE(15 SP2)实操
- SAP Corbu Theme 在浏览器和 SAPGUI 应用中的使用场景
- SAP MM 物料移动平均价的修改历史
- 澄清一些对 SAP UI5 响应式表格 sap.m.Table 的常见理解误区试读版
- SAP UI5 响应式表格 sap.m.Table 根据不同宽度的屏幕动态决定显示或隐藏 Column 的实现源代码讲解试读版
- SAP Commerce Cloud 里的 jsapps 和 jsapps-ssr 容器
- SAP 业务T-CODE详解编程语言
- sap去除后缀0方法详解编程语言
- SAP资产明细报表详解编程语言
- SAP SD订单状态详解编程语言
- SAP MD04相关报表开发详解编程语言
- Sap权限相关设置、控制及传输详解编程语言
- SAP已发票校验采购订单退货 – 特殊业务详解编程语言
- SAP在Linux系统的安装与使用(sap安装linux)
- 深度比较:SAP vs Oracle(sap与oracle比较)
- 实战实现自动化:OracleSAP实战(oracle(sap))
- 系统Oracle公司收购SAP系统开启新的商业时代(Oracle公司sap)
- Oracle与SAP权衡利弊比较之路(oracle与sap比较)
- 跨界合作新模式 Oracle与SAP实现合并(oracle与sap合并)
- 聘请高级Oracle与SAP顾问,拓展业务潜力(oracle sap顾问)