首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DFDL中的跳出回路

DFDL中的跳出回路
EN

Stack Overflow用户
提问于 2018-10-23 09:49:33
回答 1查看 298关注 0票数 0

我正在尝试使用DFDL将平面文件转换为XML。它有以下格式:每个元素为5,byte.All在一行,但我将它们分开以避免混淆。我将用它们中的第一个字母来寻址元素。

代码语言:javascript
复制
0AAAA  
81AAA  
eeeee  
qqqqq    
82BBB    
rrrrr  
sssss  
9QQQQ  

现在0和9是祖父母,我们不必担心他们。8是父字节,81AAA的第二个字节(即1)将决定其子字节的格式。可以有8位家长的8位和多位子女(但他们都有相同的格式)。

我尝试过一个模式,但是一旦它进入子模式(Eeeee),它就不会从模式中出来,而且所有的记录都是以子格式打印出来的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-23 12:10:15

下面是我认为描述数据的模式,在Daffodil 2.2.0上进行了测试:

代码语言:javascript
复制
<xs:schema
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:fn="http://www.w3.org/2005/xpath-functions"
  xmlns:dfdl="http://www.ogf.org/dfdl/dfdl-1.0/">

  <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd" />

  <xs:annotation>
    <xs:appinfo source="http://www.ogf.org/dfdl/">
      <dfdl:format ref="GeneralFormat" />
    </xs:appinfo>
  </xs:annotation>

  <xs:element name="Root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="GrandParent" maxOccurs="unbounded">
          <xs:complexType>
            <xs:choice dfdl:initiatedContent="yes">
              <xs:element name="Zero" dfdl:initiator="0">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Value" type="xs:string" dfdl:length="4" dfdl:lengthKind="explicit" />
                    <xs:element ref="Eight" minOccurs="0" maxOccurs="unbounded" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="Nine" dfdl:initiator="9">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Value" type="xs:string" dfdl:length="4" dfdl:lengthKind="explicit" />
                    <xs:element ref="Eight" minOccurs="0" maxOccurs="unbounded" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:choice>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="Eight" dfdl:initiator="8">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="ChildrenFormat" type="xs:string" dfdl:length="1" dfdl:lengthKind="explicit" />
        <xs:element name="Value" type="xs:string" dfdl:length="3" dfdl:lengthKind="explicit" />
        <xs:choice dfdl:choiceDispatchKey="{ ./ChildrenFormat }">
          <xs:element ref="One" maxOccurs="unbounded" dfdl:choiceBranchKey="1" />
          <xs:element ref="Two" maxOccurs="unbounded" dfdl:choiceBranchKey="2" />
        </xs:choice>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="One" type="xs:string" dfdl:length="5" dfdl:lengthKind="explicit">
    <xs:annotation>
      <xs:appinfo source="http://www.ogf.org/dfdl/">
        <dfdl:discriminator test="{ fn:not(fn:starts-with(., '8') or fn:starts-with(., '9')) }" />
      </xs:appinfo>
    </xs:annotation>
  </xs:element>

  <xs:element name="Two" type="xs:string" dfdl:length="5" dfdl:lengthKind="explicit">
    <xs:annotation>
      <xs:appinfo source="http://www.ogf.org/dfdl/">
        <dfdl:discriminator test="{ fn:not(fn:starts-with(., '8') or fn:starts-with(., '9')) }" />
      </xs:appinfo>
    </xs:annotation>
  </xs:element>

</xs:schema>

对此如何工作的描述:

  • 数据的根是GrandParent元素的无界数
  • 每个GrandParent元素都包含基于启动器的零或九。发起者使用祖父母数据的第一个字节。
  • Zero/Nine元素包含一个值,该值使用梯度数据的其余4个字节
  • 值后面是零或更多个元素。
  • 每个八个元素都有一个"8“的启动器,消耗5个字节中的第一个字节。
  • 每个八个元素都有一个ChildrenFormat,消耗了5个字节的第二个字节。
  • 每个八个元素都有一个值,消耗5个字节中的最后3个。
  • 每八个元素都有一个无界的数字,即所有一个或全部两个元素。
  • choiceDispatchKey/分支用于确定是解析所有的一个还是全部两个元素,将ChildrenFormat元素分派出去
  • 每一个或两个元素消耗5个字节。
  • 为了确定一个或两个元素的无界数何时结束,在一个/两个元素上放置一个鉴别器。当解析为1/2的数据不以“8”或“9”开头时,此鉴别器将失败。
  • 此外,为了简单起见,所有字段都被视为字符串。

这样,您的示例数据将解析为如下信息集:

代码语言:javascript
复制
<Root>
  <GrandParent>
    <Zero>
      <Value>AAAA</Value>
      <Eight>
        <ChildrenFormat>1</ChildrenFormat>
        <Value>AAA</Value>
        <One>eeeee</One>
        <One>qqqqq</One>
      </Eight>
      <Eight>
        <ChildrenFormat>2</ChildrenFormat>
        <Value>BBB</Value>
        <Two>rrrrr</Two>
        <Two>sssss</Two>
      </Eight>
    </Zero>
  </GrandParent>
  <GrandParent>
    <Nine>
      <Value>QQQQ</Value>
    </Nine>
  </GrandParent>
</Root>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52946064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档