0

根据文档:

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 进行彻底的迭代。最后一次迭代将包含</X0>. 这也与默认序列化匹配,并将跳转到这种情况。在结束标记上跳过的结果是一个CX_ST_MATCH例外。

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

4

1 回答 1

1

我不知道是否有解决方案<tt:skip .../>,但是属性有一个替代方案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>

注意:<X1><tt:value ref="ROOT1"/></X1>可以简化为<X1 tt:value-ref="ROOT1"/>.

于 2021-11-20T22:33:53.637 回答