首页 > 解决方案 > 读取标签值. 如何?

问题描述

我有以下代码:

<TASKDATA>
<PACKAGE>BADI BS Aggr Profit Centers to Entity</PACKAGE>
<TEAM/>
<GROUP>Financial Process</GROUP>
<APPSET>OneMIS_DEV</APPSET>
<APPLICATION>Planning_DEV</APPLICATION>
<ANSWERPROMPT>%SELECTION% 
|DIMENSION:CATEGORY|AC0|DIMENSION:P_ENTITY||10DIMENSION:TIME|2019.09
%SELECTION_KEYDATE% </ANSWERPROMPT>
</TASKDATA>
</LINK_PROCESS>
<LINK_PROCESS LINK_TYPE="BPC_PACKAGE">
<PROPERTY NAME="NAME">Deconsolidation</PROPERTY>
<PROPERTY NAME="DESCRIPTION">Deconsolidation (Static Comp Code 
Filter)</PROPERTY>
<PROPERTY NAME="ID">583FA498C7BE45D4BECFF0F73FADA10B</PROPERTY>
<TASKDATA>
<PACKAGE>Deconsolidation</PACKAGE>
<TEAM/>
<GROUP>Financial Process</GROUP>
<APPSET>OneMIS_DEV</APPSET>
<APPLICATION>Planning_DEV</APPLICATION>
<ANSWERPROMPT>%SELECTION%
|DIMENSION:CATEGORY|AC0|DIMENSION:P_ENTITY|CZ20|27DIMENSION:TIME|2019.09 %SELECTION_KEYDATE% </ANSWERPROMPT>
</TASKDATA>

我只需要选择标签 Deconsolidation 下的字符串 P_ENTITY。例如,在示例中,必须跳过第 9 行的字符串 P_ENTITY,因为上面有标签 BADI BS Aggr Profit Centers to Entity。另一方面,必须选择第 26 行的字符串 P_ENTITY,因为上面有标签 Deconsolidation How can I do?。

我尝试过使用正则表达式P_ENTITY.{1,1}([A-Z]{2}[0-9]{2},*)*,但它选择了所有 P_ENTITY 字符串。

标签: regexabap

解决方案


如果您拥有完全有效的 XML,即您的 XML 具有包装父标签的<LINK_PROCESS>标签

<LINKS>
    <LINK_PROCESS LINK_TYPE="BPC_PACKAGE">
        <TASKDATA>
            <PACKAGE>BADI BS Aggr Profit Centers to Entity</PACKAGE>
            <TEAM/>
            <GROUP>Financial Process</GROUP>
            <APPSET>OneMIS_DEV</APPSET>
            <APPLICATION>Planning_DEV</APPLICATION>
            <ANSWERPROMPT>%SELECTION% |DIMENSION:CATEGORY|AC0|DIMENSION:P_ENTITY||10DIMENSION:TIME|2019.09%SELECTION_KEYDATE% </ANSWERPROMPT>
        </TASKDATA>
    </LINK_PROCESS>
    <LINK_PROCESS LINK_TYPE="BPC_PACKAGE">
        <PROPERTY NAME="NAME">Deconsolidation</PROPERTY>
        <PROPERTY NAME="DESCRIPTION">Deconsolidation (Static Comp Code Filter)</PROPERTY>
        <PROPERTY NAME="ID">583FA498C7BE45D4BECFF0F73FADA10B</PROPERTY>
        <TASKDATA>
            <PACKAGE>Deconsolidation</PACKAGE>
            <TEAM/>
            <GROUP>Financial Process</GROUP>
            <APPSET>OneMIS_DEV</APPSET>
            <APPLICATION>Planning_DEV</APPLICATION>
            <ANSWERPROMPT>%SELECTION%|DIMENSION:CATEGORY|AC0|DIMENSION:P_ENTITY|CZ20|27DIMENSION:TIME|2019.09 %SELECTION_KEYDATE% </ANSWERPROMPT>
        </TASKDATA>
    </LINK_PROCESS>
</LINKS>

您可以使用以下 ST 转换解析您的 XMLzdecon

<?sap.transform simple?>
<tt:transform xmlns:tt="http://www.sap.com/transformation-templates" template="main">
  <tt:root name="ROOT"/>
  <tt:template name="main">
   <LINKS>
    <tt:loop name="line" ref="ROOT">
      <LINK_PROCESS>
      <tt:skip name="PROPERTY" count="*" />
        <TASKDATA>
          <PACKAGE>
            <tt:value ref="package"/>
          </PACKAGE>
          <tt:skip count="4"/>
          <ANSWERPROMPT>
            <tt:value ref="answer"/>
          </ANSWERPROMPT>
        </TASKDATA>
      </LINK_PROCESS>
    </tt:loop>
    </LINKS>
  </tt:template>
</tt:transform>

并在 ABAP 中这样称呼它:

TYPES: BEGIN OF entity,
        package TYPE string,
        answer TYPE string,
      END OF entity,
      tt_entities TYPE STANDARD TABLE OF entity WITH DEFAULT KEY.

DATA: xml_string TYPE string.
DATA: tab        TYPE tt_entities.

xml_string = ` <LINKS><LINK_PROCESS LINK_TYPE="BPC_PACKAGE"> ` &&
` <TASKDATA> ` &&
...
`   </TASKDATA> ` &&
`   </LINK_PROCESS></LINKS>`.

CALL TRANSFORMATION zdecon
             SOURCE XML xml_string
             RESULT root = tab.

DELETE tab WHERE package <> 'Deconsolidation'.

LOOP AT tab ASSIGNING FIELD-SYMBOL(<line>).
  SPLIT <line>-answer AT '|' INTO TABLE DATA(deconsolidations).
  FIND REGEX '.+P_ENTITY' IN TABLE deconsolidations MATCH LINE DATA(l).
  WRITE: deconsolidations[ l + 1 ].
ENDLOOP.

为您的 XML 做出的几个假设:

  1. <PROPERTY>标签是任意的,可能会丢失

  2. <ANSWERPROMPT>标记包含包含在 %SELECTION% 占位符中的维度列表

  3. 每个维度都以|DIMENSION:<dim_name>|<dim_value>|

  4. DIMENSION 关键字前的随机数无关紧要,可以忽略

27维度:时间


推荐阅读