利用DEEP Table做层次XML输出(原文转自网络)

本文介绍如何使用DEEPTable工具生成层次化的XML输出文件。通过ABAP编程实现从数据库中提取采购订单及其明细数据,并构建成XML结构进行下载。涉及的技术包括数据表操作、XML元素创建及属性设置。

利用DEEP Table做层次XML输出

(---原文转自 http://blog.chinaunix.net/u1/40527/showart_681421.html 老白的ABAP博客



*&---------------------------------------------------------------------*
*& Report Z_BARRY_TEST_XML
*&---------------------------------------------------------------------*
*& 46C - ECC6 通用
*&---------------------------------------------------------------------*
REPORT z_barry_test_xml.
TYPES: BEGIN OF ty_item ,
ebelp LIKE ekpo-ebelp ,
menge LIKE ekpo-menge ,
END OF ty_item .
TYPES tt_item TYPE STANDARD TABLE OF ty_item WITH DEFAULT KEY .
DATA: itab_item TYPE STANDARD TABLE OF ty_item WITH HEADER LINE ,
wa_item LIKE LINE OF itab_item.
TYPES: BEGIN OF ty_po ,
ebeln LIKE ekko-ebeln ,
aedat LIKE ekko-aedat ,
item TYPE tt_item ,
END OF ty_po .
DATA: itab_po TYPE STANDARD TABLE OF ty_po WITH HEADER LINE .
DATA: BEGIN OF itab_all OCCURS 0 ,
ebeln LIKE ekko-ebeln ,
aedat LIKE ekko-aedat ,
ebelp LIKE ekpo-ebelp ,
menge LIKE ekpo-menge ,
END OF itab_all.
DATA: tmpebeln LIKE ekko-ebeln.
DATA: l_ixml TYPE REF TO if_ixml,
l_encoding TYPE REF TO if_ixml_encoding,
l_comment TYPE REF TO if_ixml_comment,
l_doc TYPE REF TO if_ixml_document,
l_root TYPE REF TO if_ixml_element,
l_po TYPE REF TO if_ixml_element,
l_pohead TYPE REF TO if_ixml_element,
l_item TYPE REF TO if_ixml_element,
l_element TYPE REF TO if_ixml_element,
l_attribute TYPE REF TO if_ixml_attribute,
l_ostream TYPE REF TO if_ixml_ostream,
l_factory TYPE REF TO if_ixml_stream_factory.
TYPES: BEGIN OF xml_line,
data(256) TYPE x,
END OF xml_line.
DATA: xml_table TYPE TABLE OF xml_line,
xml_size TYPE i.
DATA: l_rval TYPE i.
DATA: str TYPE string .
SELECT-OPTIONS : s_ebeln FOR itab_all-ebeln.
START-OF-SELECTION.
PERFORM getdata.
PERFORM create_xml.
PERFORM download.
*---------------------------------------------------------------------*
* FORM getdata *
*---------------------------------------------------------------------*
FORM getdata.
SELECT ekko~ebeln ekko~aedat ekpo~ebelp ekpo~menge
INTO TABLE itab_all
FROM ekko INNER JOIN ekpo ON ekko~ebeln = ekpo~ebeln
WHERE ekko~ebeln IN s_ebeln.
SORT itab_all BY ebeln ebelp.
LOOP AT itab_all .
ON CHANGE OF itab_all-ebeln .
CLEAR itab_po-item .
CLEAR tmpebeln .
tmpebeln = itab_all-ebeln .
LOOP AT itab_all WHERE ebeln = tmpebeln .
wa_item-ebelp = itab_all-ebelp .
wa_item-menge = itab_all-menge .
APPEND wa_item TO itab_po-item .
ENDLOOP .
SORT itab_po-item BY ebelp.
itab_po-ebeln = itab_all-ebeln .
itab_po-aedat = itab_all-aedat .
APPEND itab_po .
ENDON .
ENDLOOP .
ENDFORM. "getdata
*---------------------------------------------------------------------*
* FORM create_xml *
*---------------------------------------------------------------------*
FORM create_xml.
CLASS cl_ixml DEFINITION LOAD.
l_ixml = cl_ixml=>create( ).
CALL METHOD l_ixml->create_encoding
EXPORTING
byte_order = 0
character_set = 'gb2312'
RECEIVING
rval = l_encoding.
CALL METHOD l_ixml->create_document
RECEIVING
rval = l_doc.
CALL METHOD l_doc->set_encoding
EXPORTING
encoding = l_encoding.
CALL METHOD l_doc->create_simple_element
EXPORTING
name = 'Root'
parent = l_doc
RECEIVING
rval = l_root.
CALL METHOD l_root->set_attribute
EXPORTING
name = 'ATTRIBUTE'
value = 'sample'
RECEIVING
rval = l_rval.
CALL METHOD l_doc->create_comment
EXPORTING
comment = '''上面ATTRIBUTE为属性示例'''
RECEIVING
rval = l_comment.
CALL METHOD l_root->append_child
EXPORTING
new_child = l_comment
RECEIVING
rval = l_rval.
LOOP AT itab_po.
CALL METHOD l_doc->create_simple_element
EXPORTING
name = 'po'
parent = l_root
RECEIVING
rval = l_po.
CALL METHOD l_doc->create_simple_element
EXPORTING
name = 'pohead'
parent = l_po
RECEIVING
rval = l_pohead.
str = itab_po-ebeln .
CALL METHOD l_doc->create_simple_element
EXPORTING
name = 'ponumber'
parent = l_pohead
value = str
RECEIVING
rval = l_element.
str = itab_po-aedat .
CALL METHOD l_doc->create_simple_element
EXPORTING
name = 'podate'
parent = l_pohead
value = str
RECEIVING
rval = l_element.
PERFORM fill_itab2xml TABLES itab_po-item
USING 'pobody'
'poitem'
l_po.
ENDLOOP.
CALL METHOD l_ixml->create_stream_factory
RECEIVING
rval = l_factory.
CALL METHOD l_factory->create_ostream_itable
EXPORTING
table = xml_table
RECEIVING
rval = l_ostream.
CALL METHOD l_doc->render
EXPORTING
ostream = l_ostream
recursive = 'X'.
CALL METHOD l_ostream->get_num_written_raw
RECEIVING
rval = xml_size.
ENDFORM. "create_xml
*---------------------------------------------------------------------*
* FORM fill_itab *
*---------------------------------------------------------------------*
FORM fill_itab2xml TABLES intab
USING node1name TYPE string
node2name TYPE string
l_parent TYPE REF TO if_ixml_element.
DATA: BEGIN OF headtab OCCURS 0 ,
length TYPE i ,
decimals TYPE i,
type_kind TYPE c,
name(30) TYPE c,
END OF headtab.
DATA descr_ref TYPE REF TO cl_abap_structdescr.
FIELD-SYMBOLS: <comp_wa> TYPE abap_compdescr ,
<f_field> ,
<f_intab> TYPE ANY .
DATA: n TYPE i ,
str TYPE string ,
itemname TYPE string ,
text1 TYPE c ,
l_node TYPE REF TO if_ixml_element ,
l_item TYPE REF TO if_ixml_element .
descr_ref ?= cl_abap_typedescr=>describe_by_data( intab ).
LOOP AT descr_ref->components ASSIGNING <comp_wa>.
MOVE-CORRESPONDING <comp_wa> TO headtab.
APPEND headtab.
ENDLOOP.
CALL METHOD l_doc->create_simple_element
EXPORTING
name = node1name
parent = l_parent
RECEIVING
rval = l_node.
DESCRIBE TABLE headtab LINES n.
LOOP AT intab ASSIGNING <f_intab>.
CALL METHOD l_doc->create_simple_element
EXPORTING
name = node2name
parent = l_node
RECEIVING
rval = l_item.
DO n TIMES.
ASSIGN COMPONENT sy-index OF STRUCTURE <f_intab> TO <f_field>.
str = <f_field>.
READ TABLE headtab INDEX sy-index.
IF headtab-type_kind = 'I' OR headtab-type_kind = 'P'
OR headtab-type_kind = 'F'.
SEARCH str FOR '-'.
IF sy-subrc = 0 AND sy-fdpos <> 0.
SPLIT str AT '-' INTO str text1.
CONDENSE str.
CONCATENATE '-' str INTO str.
ELSE.
CONDENSE str.
ENDIF.
ELSE.
* SHIFT str LEFT DELETING LEADING '0' .
ENDIF.
itemname = headtab-name .
CALL METHOD l_doc->create_simple_element
EXPORTING
name = itemname
parent = l_item
value = str
RECEIVING
rval = l_element.
ENDDO.
ENDLOOP.
ENDFORM. "fill_itab2xml
*---------------------------------------------------------------------*
* FORM download *
*---------------------------------------------------------------------*
FORM download.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
bin_filesize = xml_size
filename = 'C:\46C.XML'
filetype = 'BIN'
TABLES
data_tab = xml_table.
ENDFORM. "download


. 元数据集成(Profile M扩展) 流式传输:分析数据(如车牌识别)通过 RTP附加通道 或 RTSP METADATA 指令嵌入视频流。 过滤机制:客户端可指定元数据类型(如 VehicleDetector)减少带宽占用。——”元数据集成"这里能不能详细讲讲,但不能脱离profile M协议,绝对绝对不能胡乱编造不存在的东西,可参考这个;11.10元数据配置 元数据配置包含的参数用于选择数据放到在元数据流中的。包括PTZ状态、PTZ位置以及订阅和分析数据定义的事件。事件订阅数据是在第15.5节。由分析参数定定义包含来自那一部分文件的分析引擎数据,请参阅11.9节。 结构还包含用于配置和控制元数据流组播的组播参数。会话超时参数定义会话超时(见第12.2.1.1.1 ) 如果配置文件里面使用了一个元数据配置,该配置的UseCount加1,用于表示改变该配置可能影响其他用户。 11.10.1 获取多个元数据配置 此操作列出了所有现有的元数据配置。客户端不需要知道任何元数据的情况就能使用命令。支持元数据流的NVT或其他设备应支持通过GetMetadataConfigurations命令列出现有的元数据配置。 表168:GetMetadataConfigurations命令 GetMetadataConfigurations 请求-响应 消息名称 描述 GetMetadataConfigurations-Request 空消息。 GetMetadataConfigurations-Response 此消息包含设备所有现有的元数据配置清单。 tt:MetadataConfiguration Configurations [0][unbounded] 错误码 描述 没有具体的错误命令。 11.10.2 获取元数据配置 GetMetadataConfiguration命令获取元数据令牌已知的元数据配置。支持元数据流的NVT或其他设备支持通过GetMetadataConfiguration命令列出特定的元数据配置。 表169:GetMetadataConfiguration命令 GetMetadataConfiguration 请求-响应 消息名称 描述 GetMetadataConfiguration- Request 此消息包含现有的元数据配置令牌。 tt:ReferenceToken ConfigurationToken [1][1] GetMetadataConfiguration- Response 此消息包含请求的元数据配置。 tt:MetadataConfiguration Configurations [0][unbounded] 错误码 描述 env:Sender ter:InvalidArgVal ter:NoConfig 表明请求的配置令牌ConfigurationToken不存在。 11.10.3 获取多个兼容元数据配置 此操作请求设备所有的与相关的媒体文件兼容元数据配置。每个返回的配置应是媒体文件AddMetadataConfiguration命令的有效输入参数。结果因设备的功能,配置和设置而异。支持元数据流的NVT或其他设备支持通过GetCompatibleMetadataConfigurations命令列出(与特定的文件)兼容的元数据配置。 表170:GetCompatibleMetadataConfigurations命令 GetCompatibleMetadataConfigurations 请求-响应 消息名称 描述 GetCompatibleMetadata- ConfigurationsRequest 此消息包含现有的媒体文件令牌。 tt:ReferenceToken ProfileToken [1][1] GetCompatibleMetadata- ConfigurationsResponse 此消息包含与给定媒体文件兼容的元数据配置清单。 tt:MetadataConfiguration Configurations [0][unbounded] 错误码 描述 env:Sender ter:InvalidArgVal ter:NoProfile 表明请求文件令牌ProfileToken不存在。 11.10.4 获取元数据配置选项集 此操作返回更改元数据配置的有效的选项。支持元数据流的NVT或其他设备支持通过GetMetadataConfigurationOptions命令列出有效的元数据参数选项(对于一个给定的文件和配置)。 表171:GetMetadataConfigurationOptions命令 GetMetadataConfigurationOptions 请求-响应 消息名称 描述 GetMetadataConfiguration-OptionsRequest 此消息包含一个元数据配置可选的令牌和媒体文件。 ConfigurationToken指定一个现有的配置的目标选项。 ProfileToken指定一个应兼容现有的媒体文件的选项。 tt:ReferenceToken ConfigurationToken [0][1] tt:ReferenceToken ProfileToken [0][1] GetMetadataConfiguration-OptionsResponse 此消息包含元数据的配置选项。指定的元数据配置选项应关联特定的配置。指定的选项应与该媒体文件兼容。如果没有指定标记,选项应被视为通用设备。 tt:MetadataConfigurationOptions Options [1][1] 错误码 描述 env:Sender ter:InvalidArgVal ter:NoProfile 表明请求文件令牌ProfileToken不存在的。 env:Sender ter:InvalidArgVal ter:NoConfig 请求配置不存在。 11.10.5 修改元数据配置 此操作修改元数据配置。ForcePersistence标志表示设备重启后是否应保持改变。组播设置的改变是永久的。使用此配置的运行流可根据新的设置立即更新。但所的更改不会生效,除非客户端请求一个新的URI流并重新启动任何受影响的流。用RVC改变运行流的方法超出本规范的范围。支持元数据流的NVT或其他设备支持通过SetMetadataConfiguration命令配置元数据参数。 表172:SetMetadataConfiguration命令 SetMetadataConfiguration 请求-响应 消息名称 描述 SetMetadataConfiguration- Request 配置元素包含组播设置以及一套在元数据流中确定列入什么样的数据的过滤器。 ForcePersistence元素决定是否在重启后存储和保持配置更改。如果为真,改变是永久的。如果为假,可能会在重新启动后恢复到改变以前的值。 tt:MetadataConfiguration Configuration [1][1] xs:boolean ForcePersistence [1][1] SetMetadataConfiguration- Response 空消息。 错误码 描述 env:Sender ter:InvalidArgVal ter:NoConfig 请求配置不存在。 env:Sender ter:InvalidArgVal ter:ConfigModify 请求配置不能设置。 env:Receiver ter:Action ter:ConfigurationConflict 新设置与其他使用的设置冲突。
最新发布
09-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值