Цикл в DFDL - PullRequest
       35

Цикл в DFDL

0 голосов
/ 12 октября 2018

Я пытаюсь преобразовать файл ралли сложной фиксированной длины в XML, используя DFDL и Daffodil.Каждая строка будет отвечать за один элемент, и первый элемент каждой строки скажет мне, какой это будет элемент.Это может быть Родитель A или Родитель B, или это может быть дочерний AA или AB или BB или BA.

Где Родитель A является одним элементом, Родитель B является другим, а Дочерний AA является первым потомком Элемента A.

Внутри одного файла есть несколько Parent A и Parent B. Я пробовал тег инициатора, даже пробовал тег выбора, но, похоже, ничего не работает.Может кто-нибудь, пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 12 октября 2018

Трудно дать полный ответ без примеров данных, но использование инициаторов и вариантов выбора, вероятно, является правильным подходом.Существуют потенциально более простые схемы, зависящие от конкретных данных, но общее решение может выглядеть примерно так:

<xs:schema
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  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" lengthKind="delimited" />
    </xs:appinfo>
  </xs:annotation>

  <xs:element name="File">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Record" maxOccurs="unbounded">
          <xs:complexType>
            <xs:choice dfdl:initiatedContent="yes">
              <xs:element name="ParentA" dfdl:initiator="ParentA:">
                <xs:complexType>
                  <xs:sequence dfdl:separator="%NL;" dfdl:separatorPosition="postfix">
                    <xs:element name="Content" type="xs:string"/>
                    <xs:element name="Record" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:choice dfdl:initiatedContent="yes">
                          <xs:element name="ChildAA"  type="xs:string" dfdl:initiator="ChildAA:" />
                          <xs:element name="ChildAB"  type="xs:string" dfdl:initiator="ChildAB:" />
                        </xs:choice>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="ParentB" dfdl:initiator="ParentB:">
                <xs:complexType>
                  <xs:sequence dfdl:separator="%NL;" dfdl:separatorPosition="postfix">
                    <xs:element name="Content" type="xs:string" />
                    <xs:element name="Record" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:choice dfdl:initiatedContent="yes">
                          <xs:element name="ChildBA" type="xs:string" dfdl:initiator="ChildBA:" />
                          <xs:element name="ChildBB" type="xs:string" dfdl:initiator="ChildBB:" />
                        </xs:choice>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:choice>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>

Эта схема имеет следующие функции:

  • Каждый файл имеетнеограниченное количество записей.
  • Каждая запись - это выбор элемента ParentA или ParentB, определяемый свойством dfdl: initiator.
  • Каждый элемент Parent содержит содержимое для этого родительского элемента (т. е.(следующий за родительским инициатором), за которым следует неограниченное количество дочерних записей.
  • Каждая дочерняя запись также определяется свойством dfdl: initator.
  • Постфиксный разделитель новой строки используется для определения, когда родительскийКонтент и дочерний контент заканчиваются.
  • Это не позволяет элементам ChildB появляться после элемента ParentA, и наоборот - дочерние элементы всегда должны появляться после ассоциированного родительского элемента.(Если бы это ограничение не было важным, эту схему можно было бы значительно упростить).

Вышеприведенные данные допускают такие данные:

ParentA:Parent A Content
ChildAA:Child AA Content
ChildAB:Child AB Content
ParentB:Parent B Content
ChildBB:Child BB Content
ParentA:Parent A Content
ChildAB:Child AB Content

, которые будут разбираться в инфо-набор XML, напримерэто:

<File>
  <Record>
    <ParentA>
      <Content>Parent A Content</Content>
      <Record>
        <ChildAA>Child AA Content</ChildAA>
      </Record>
      <Record>
        <ChildAB>Child AB Content</ChildAB>
      </Record>
    </ParentA>
  </Record>
  <Record>
    <ParentB>
      <Content>Parent B Content</Content>
      <Record>
        <ChildBB>Child BB Content</ChildBB>
      </Record>
    </ParentB>
  </Record>
  <Record>
    <ParentA>
      <Content>Parent A Content</Content>
      <Record>
        <ChildAB>Child AB Content</ChildAB>
      </Record>
    </ParentA>
  </Record>
</File>

Выше тестируется с Apache Daffodil 2.2.0

...