Дизассемблер BizTalk для плоских файлов игнорирует разрыв записи
С учетом документа с разделителями в трубе:
HDR|A
PSN|CCC|111|00|111111111|DOE|JOHN||M
PSN|CCC|111|01|111111111|DOE|JANE|A|F|07/30/1975
ADR|CCC|111|00|U|100 S 1ST #11||ANYTOWN|US|XX|55555|09/24/2013|
PHN|CCC|111|00|U|US|5551111111||09/24/2013|
и схема BizTalk:
<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns="http://xxxx.com/schemas/test1" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" targetNamespace="http://xxxx.com/schemas/test1" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:annotation>
<xs:appinfo>
<schemaEditorExtension:schemaInfo namespaceAlias="b" extensionClass="Microsoft.BizTalk.FlatFileExtension.FlatFileExtension" standardName="Flat File" xmlns:schemaEditorExtension="http://schemas.microsoft.com/BizTalk/2003/SchemaEditorExtensions" />
<b:schemaInfo standard="Flat File" codepage="65001" default_pad_char=" " pad_char_type="char" count_positions_by_byte="false" parser_optimization="complexity" lookahead_depth="0" suppress_empty_nodes="false" generate_empty_nodes="true" allow_early_termination="true" early_terminate_optional_fields="true" allow_message_breakup_of_infix_root="false" compile_parse_tables="false" root_reference="Root" />
</xs:appinfo>
</xs:annotation>
<xs:element name="Root">
<xs:annotation>
<xs:appinfo>
<b:recordInfo structure="delimited" child_delimiter_type="hex" child_order="postfix" sequence_number="1" preserve_delimiter_for_empty_data="true" suppress_trailing_delimiters="true" child_delimiter="0x0D 0x0A" />
</xs:appinfo>
</xs:annotation>
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:appinfo>
<groupInfo sequence_number="0" xmlns="http://schemas.microsoft.com/BizTalk/2003" />
</xs:appinfo>
</xs:annotation>
<xs:element minOccurs="1" maxOccurs="1" name="Header" type="HeaderType">
<xs:annotation>
<xs:appinfo>
<b:recordInfo structure="delimited" child_delimiter_type="char" child_delimiter="|" child_order="infix" preserve_delimiter_for_empty_data="true" suppress_trailing_delimiters="false" tag_name="HDR" tag_offset="0" sequence_number="1" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Person" type="PersonType">
<xs:annotation>
<xs:appinfo>
<b:recordInfo structure="delimited" tag_name="PSN" tag_offset="0" preserve_delimiter_for_empty_data="true" suppress_trailing_delimiters="false" child_delimiter_type="char" child_delimiter="|" sequence_number="2" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Address" type="AddressType">
<xs:annotation>
<xs:appinfo>
<b:recordInfo structure="delimited" tag_name="ADR" tag_offset="0" preserve_delimiter_for_empty_data="true" suppress_trailing_delimiters="false" child_delimiter_type="char" child_delimiter="|" sequence_number="3" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Phone" type="PhoneType">
<xs:annotation>
<xs:appinfo>
<b:recordInfo structure="delimited" tag_name="PHN" tag_offset="0" preserve_delimiter_for_empty_data="true" suppress_trailing_delimiters="false" child_delimiter_type="char" child_delimiter="|" sequence_number="4" />
</xs:appinfo>
</xs:annotation>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:complexType name="HeaderType">
<xs:attribute default="" name="type" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="1" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:attribute default="" name="description" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="2" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
</xs:complexType>
<xs:complexType name="PersonType">
<xs:attribute name="group" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="1" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:attribute name="id" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="2" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:attribute name="seq" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="3" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:attribute default="" name="ssn" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="4" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:attribute name="last" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="5" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:attribute name="first" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="6" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:attribute default="" name="mi" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="7" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:attribute default="" name="gender" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="8" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:attribute default="" name="dob" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="9" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
</xs:complexType>
<xs:complexType name="AddressType">
<xs:attribute name="group" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="1" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:attribute name="id" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="2" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:attribute name="seq" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="3" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:attribute name="type" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="4" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:attribute default="" name="addr1" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="5" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:attribute default="" name="addr2" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="6" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:attribute default="" name="city" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="7" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:attribute default="" name="country" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="8" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:attribute default="" name="state" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="9" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:attribute default="" name="zip" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="10" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:attribute name="date" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="11" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:attribute default="" name="filler" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="12" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
</xs:complexType>
<xs:complexType name="PhoneType">
<xs:attribute name="client_code" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="1" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:attribute name="id" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="2" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:attribute name="seq" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="3" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:attribute name="type" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="4" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:attribute default="" name="country" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="5" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:attribute default="" name="number" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="6" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:attribute default="" name="extension" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="7" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:attribute default="" name="date" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="8" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:attribute default="" name="filler" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="9" />
</xs:appinfo>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:schema>
где "выбор" используется в корне (поскольку дочерние записи могут быть в любом порядке), и где "тэг_имя" используется для сопоставления записей с элементами схемы.
и работает через утилиту fadsm
ffdasm "test1.psv" -bs "test1.xsd" -s -m "test1.xml" -v -s
чтобы получить это
- <Root xmlns="http://xxxx.com/schemas/test1">
<Header type="" description="A" xmlns="" />
<Person group="CCC" id="111" seq="00" ssn="111111111" last="DOE" first="JOHN" mi="" gender="M PSN" dob="CCC|111|01|111111111|DOE|JANE|A|F|07/30/1975" xmlns="" />
<Address group="CCC" id="111" seq="00" type="U" addr1="100 S 1ST #11" addr2="" city="ANYTOWN" country="US" state="XX" zip="55555" date="09/24/2013" filler="" xmlns="" />
<Phone client_code="CCC" id="111" seq="00" type="U" country="US" number="5551111111" extension="" date="09/24/2013" filler="" xmlns="" />
</Root>
Почему значение первого поля ("A") записи заголовка (HDR) входит в неправильный (второй) атрибут выходного XML?
Почему разделитель записей (CRLF / 0x0D ox0A) игнорируется так, что содержимое второй (PSN) записи входит в необязательные атрибуты предыдущей записи в результирующем XML, когда схема настроена для досрочного завершения записей и необязательных полей?
и кстати
- Почему содержимое, совпадающее с "tag_name", исключается из выходного XML для файлов с разделителями? Это не происходит с плоскими файлами фиксированной длины; в них данные tag_name сохраняются в выходных данных.
Любое понимание очень ценится.
1 ответ
Первое поле в HDR идет ко второму полю из-за child_order, который вы определили для Infix. Есть три дочерних заказа, Префикс, Инфикс, Постфикс.
Префикс означает, что разделитель встречается перед каждым полем. |1|2|3
Инфикс означает, что это происходит между каждым полем. 1|2|3
Постфикс означает, что это происходит после каждого поля. 1|2|3|
Теперь вы выбрали Infix. Итак, давайте посмотрим на вашу линию.
HDR|A
Вы сказали, что это тег HDR, поэтому он удаляет его и оставляет
|A
Как это инфикс, что до | это поле 1, а после это поле 2.
То, что вы хотите, это префикс.
Как вы уже видели, имена тегов удаляются, они рассматриваются как имена записей.
Что касается игнорирования разделителя записей, это плохая привычка для распространителя плоских файлов, если он ожидает другое поле, которое не находит, а затем использует следующую строку, чтобы попасть в это поле. Снова проверьте, какой тип дочернего заказа вы делаете, и правильно ли совпадают поля.