【问题标题】:Ignore closing tag in tt:group standard deserialization忽略 tt:group 标准反序列化中的结束标记
【发布时间】:2021-12-30 13:13:45
【问题描述】:

根据文档:

Only one deserialization-relevant case that does not contain a pattern can be specified.
This case is called standard deserialization.

现在的问题是,在另一个标签中,标准反序列化也将匹配结束标签。
假设我们有以下 xml:

<X0>
   <X1>1</X1>
   <X1>2</X1>
   <X2>3</X2>
   <X2>99</X2>
   <X2>4</X2>
   <X3>5</X3>
   <X4>6</X4>
   <X2>888</X2>
</X0>.

现在用 ST

<X0>
  <tt:group>
    <tt:cond frq="*">
      <X1>
        <tt:value ref="ROOT1"/>
      </X1>
    </tt:cond>
    <tt:cond frq="?">
      <X90>
        <tt:value ref="ROOT4"/>
      </X90>
    </tt:cond>
    <tt:cond frq="*">
      <tt:skip count="1"/>
    </tt:cond>
  </tt:group>
</X0>

由于 X90 是可选的且从未找到,因此我们将对输入 XML 进行彻底的迭代。最后一次迭代将包含&lt;/X0&gt;。这也与默认序列化匹配,并将跳转到这种情况。在结束标记上跳过的结果是 CX_ST_MATCH 异常。

如何确保只跳过起始标签?

【问题讨论】:

    标签: abap abap-st


    【解决方案1】:

    我不知道&lt;tt:skip .../&gt; 是否有解决方案,但是属性tt:extensible="on" 有一个替代方案(值deep-staticdeep-dynamic 也可以使用),因此“元素是未明确指定的可以跳过,无需进一步处理”:

    <X0 tt:extensible="on">
      <tt:group>
        <tt:cond frq="*">
          <X1>
            <tt:value ref="ROOT1"/>
          </X1>
        </tt:cond>
        <tt:cond frq="?">
          <X90>
            <tt:value ref="ROOT4"/>
          </X90>
        </tt:cond>
      </tt:group>
    </X0>
    

    注意:&lt;X1&gt;&lt;tt:value ref="ROOT1"/&gt;&lt;/X1&gt; 可以简化为 &lt;X1 tt:value-ref="ROOT1"/&gt;

    【讨论】:

    • ABAP/ST 世界的救星。再次感谢你!有趣的是,文档中提到的标准反序列化一旦有了可选标签就真的没用了,因为如果它不存在,它总是会出错。
    猜你喜欢
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    相关资源
    最近更新 更多