Как сделать так, чтобы целочисленный тип данных вел себя как тип данных String в XML/XSD?

У меня есть следующее определение типа XSD/XML. Он использовался рядом бизнес-подразделений/приложений.

<xsd:simpleType name="NAICSCodeType">
        <xsd:annotation>
            <xsd:documentation>NAICSCode</xsd:documentation>
        </xsd:annotation>
        <xsd:restriction base="xsd:integer">
            <xsd:minInclusive value="000001"/>
            <xsd:maxInclusive value="999000"/>
        </xsd:restriction>
    </xsd:simpleType>

Поскольку этот тип данных определен как «целочисленный», он удаляет начальные нули ввода. Например: 0078 становится 78 после синтаксического анализа.

Нам нужно передать ввод как есть, не удаляя начальные нули, например, 0078 становится 0078 после синтаксического анализа.

Идеальное решение — изменить целое число на строку в базе ограничений. Это не начало из-за бай-ина от других групп.

Есть ли способ переопределить указанный выше тип данных для получения желаемого результата?

Как мне это сделать?

Книги и сеть, похоже, тоже не слишком помогли, поэтому я начинаю сомневаться, возможно ли это вообще теоретически.


person user2647763 - RIMD    schedule 09.01.2014    source источник
comment
Какое программное обеспечение выполняет синтаксический анализ XML? В Microsoft BizTalk начальные нули не используются при анализе или сопоставлении, если только вы не начнете использовать их математически. Даже в этом случае вы даже можете заставить его добавлять начальные нули обратно в карту при создании XML-документов. Как уже говорили другие, нет стандарта XSD, который бы это сделал, но есть некоторые приложения, которые позволяют вам этого добиться.   -  person Dijkgraaf    schedule 16.01.2014


Ответы (2)


Звучит так, как будто рассматриваемые значения на самом деле не целые числа, а строки, состоящие только из числовых цифр. Почему в схеме указано, что это целые числа, если 78, 078 и 0078 — это три разных значения, а не три способа именования одного и того же значения?

Конечно, вы можете ограничить xs:integer, потребовав начальные нули в лексическом пространстве или фиксированное количество цифр. Но это вряд ли повлияет на то, как программное обеспечение, читающее документ, повторно сериализует его или передает значения другому программному обеспечению.

person C. M. Sperberg-McQueen    schedule 15.01.2014

Теоретически не должно быть; и, насколько я знаю, нет готовых сериализаторов XML, которые можно было бы настроить для получения того, что вы описали; ведущие нули и заполняющие пробелы являются остатками эпохи записей фиксированной длины (вашим примером может быть PIC 9 (6) в тетради COBOL).

В зависимости от вашей платформы вы можете создавать собственные сериализаторы. В моем магазине я бы сказал, что это просто неправильно.

Если бы меня заставили это сделать, я бы просто использовал «частный» вариант XSD (на основе строки), поэтому внедрил бы любое форматирование на вашей стороне и покончил с этим. Частный означает, что вам не нужно «делиться» своим XSD-артефактом, который вы использовали внутри для создания любого кода, который вам нужен, с другими группами; это может создать «вход», на который вы ссылаетесь, с минимальными накладными расходами. "Рефакторинг" схемы может быть выполнен с минимальными накладными расходами...

Я предлагаю это просто потому, что необходимость мириться с этим указывает на то, что в вашей среде есть явно более серьезные проблемы, с которыми нужно иметь дело, начиная с необязательного понимания того, как правильно связать XML с устаревшими системами (дикое предположение, конечно).

person Petru Gardea    schedule 09.01.2014
comment
Мне нравится лучше понимать ваши указатели. Как выглядит частный вариант XSD (на основе строки)? Как встроить этот частный вариант в основной XSD, чтобы он мог обеспечить желаемый результат? Существуют ли какие-либо дополнительные веб-ресурсы, чтобы узнать об этом подходе? Любой пример приветствуется? - person user2647763 - RIMD; 10.01.2014
comment
Вы упомянули о копировальной книге COBOL, которая позволяет нам переопределить элемент записи для другого типа изображения. Например, альфа в число, число в альфа и т. д. Есть ли эквивалент в XML/XSD? - person user2647763 - RIMD; 10.01.2014
comment
@ user2647763, я обновлю ответ, чтобы показать пример. По сути, он заменяет xsd:int на xsd:string и добавляет фасет шаблона, соответствующий вашим требованиям. Переопределение в COBOL работает иначе, чем переопределение в XSD: первое переводится как выбор в XSD, учитывая, что поле-заполнитель или любое другое поле может быть переопределено с использованием совершенно других макетов записей. - person Petru Gardea; 10.01.2014