在 tt:group 标准反序列化中忽略结束标记
Ignore closing tag in tt:group standard deserialization
根据文档:
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>
我们将彻底遍历输入 XML,因为 X90 是可选的且从未找到。最后一次迭代将包含 </X0>
。这也匹配默认的序列化,并会跳转到这种情况。跳过结束标记的结果是 CX_ST_MATCH
异常。
如何确保只跳过起始标签?
我不知道是否有 <tt:skip .../>
的解决方案,但有一个替代方案 tt:extensible="on"
属性(值 deep-static
或 deep-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"/>
。
根据文档:
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>
我们将彻底遍历输入 XML,因为 X90 是可选的且从未找到。最后一次迭代将包含 </X0>
。这也匹配默认的序列化,并会跳转到这种情况。跳过结束标记的结果是 CX_ST_MATCH
异常。
如何确保只跳过起始标签?
我不知道是否有 <tt:skip .../>
的解决方案,但有一个替代方案 tt:extensible="on"
属性(值 deep-static
或 deep-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"/>
。