regex - 读取标签值. 如何?
问题描述
我有以下代码:
<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 字符串。
解决方案
如果您拥有完全有效的 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 做出的几个假设:
<PROPERTY>
标签是任意的,可能会丢失<ANSWERPROMPT>
标记包含包含在 %SELECTION% 占位符中的维度列表每个维度都以
|DIMENSION:<dim_name>|<dim_value>|
DIMENSION 关键字前的随机数无关紧要,可以忽略
27维度:时间
推荐阅读
- javascript - Jasmine:如何通过测试套件功能来描述方法?
- c# - 如何在.net核心中模拟数据库连接
- python - 切片低于 numpy 数组的限制
- powershell - 如何使用powershell将文件夹转换为.exe文件
- c# - 将运行 docker 容器的 C# 单元测试结果发布到 azure blob 存储
- c# - LINQ GroupBy Source = A Destination = B 或 Source = B 和 Destination = A
- amazon-web-services - Ansible 中未定义的项目
- python - 检查变量的更好方法以避免多个变量的多个条件
- javascript - bufferGeometry setFromPoints 与 react-three-fiber
- asp.net - Environment.UserName 在 IIS 上托管后不起作用。使用 ASP.net core 2.0 编写代码