"Элементы... не преобразуются в (n) определение типа" при проверке
Я пытаюсь создать XSD-файл для работы в качестве фильтра для проверки некоторых XML-файлов, которые необходимо будет обработать в дальнейшем.
Вот файл XSL:
<?xml version="1.0" encoding="ISO-8859-1"?>
<acknowledgement xmlns="http://sungardams.com/Validation.xsd" xmlns:common="http://sungardams.com/common.xsd">
<type>POSITIVE</type> <!-- must have value POSITIVE -->
<originReference>
<externalMessageId>12345678-010</externalMessageId>
</originReference>
<requestMessageId>000000000000000000000000001</requestMessageId>
<senderInfo>
<common:messageId>000000000000000000000000000001</common:messageId>
<common:externalMessageType>securityAddRequest</common:externalMessageType> <!-- must have value securityAddRequest -->
<common:applicationHistory>
<common:originatorReference>
<common:originator>GLOBAL PLUS</common:originator> <!-- must have value GLOBAL PLUS -->
<common:reference>ABCDE001</common:reference>
<common:primaryReferenceType>GREF</common:primaryReferenceType> <!-- must have value GREF -->
</common:originatorReference>
</common:applicationHistory>
</senderInfo>
</acknowledgement>
Файл, который я получаю, проверяется с использованием другого файла XSD и использует пространство имен common
(объяснить, почему некоторые элементы имеют префикс common:
).
Поэтому я создал следующие XSD-файлы:
Validation.xsd
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:common="http://sungardams.com/common.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xs:import namespace="http://sungardams.com/common.xsd" schemaLocation="http://sungardams.com/common.xsd antCommon001.xsd"/>
<xs:element name="acknowledgement">
<xs:complexType>
<xs:sequence>
<xs:element name="type" type="xs:string" fixed="POSITIVE" />
<xs:element name="originReference">
<xs:complexType>
<xs:sequence>
<xs:element name="externalMessageId" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="requestMessageId" type="xs:string" />
<xs:element name="senderInfo" type="CType_SenderInfo_ant" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Во-первых, элемент senderInfo
был определен в этом файле. Но когда я попытался сделать это таким образом, я получил бы сообщение об ошибке, что элементы недопустимы (я бы поставил перед именем имя с пространством имен common:
, так что бы получить сообщение, что они не действительны xs:NCName).
Поэтому я переместил информацию об отправителе в другой файл: antCommon001.xsd
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="CType_SenderInfo_ant">
<xs:complexType>
<xs:sequence>
<xs:element name="messageId" type="xs:string" />
<xs:element name="externalMessageType" type="xs:string" fixed="securityAddRequest" />
<xs:element name="applicationHistory">
<xs:complexType>
<xs:sequence>
<xs:element name="originatorReference">
<xs:complexType>
<xs:sequence>
<xs:element name="originator" type="xs:string" fixed="GLOBAL PLUS" />
<xs:element name="reference" type="xs:string" />
<xs:element name="primaryReferenceType" type="xs:string" fixed="GREF" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Теперь, когда я запускаю проверку XML-файла, я получаю сообщение (используя плагин проверки Notepad++ XML Tools):
Невозможно проанализировать файл схемы... элемент decl. 'senderInfo', атрибут 'type': значение QName 'CType_SenderInfo_ant' не преобразуется в (n) определение типа.
Что я делаю неправильно?
1 ответ
Вам нужно будет сделать несколько изменений, в том числе:
xs:import/@schemaLocation
не должно быть пары namespace-XSDurl, как дляxs:schema/@schemaLocation
- это должен быть просто URL-адрес XSD.- Чтобы сослаться на тип в другом пространстве имен, добавьте к нему префикс пространства имен, объявленного этому пространству имен.
- antCommon.XSD объявляет элемент, когда вы, кажется, хотите вместо этого ссылаться на тип.
В целом, с некоторыми дополнительными исправлениями, следующие обновления ваших файлов XML и XSD будут успешно проверять ваш XML:
validation.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<acknowledgement xmlns="http://sungardams.com/Validation.xsd"
xmlns:common="http://sungardams.com/common.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://sungardams.com/Validation.xsd Validation.xsd">
<type>POSITIVE</type> <!-- must have value POSITIVE -->
<originReference>
<externalMessageId>12345678-010</externalMessageId>
</originReference>
<requestMessageId>000000000000000000000000001</requestMessageId>
<senderInfo>
<common:messageId>000000000000000000000000000001</common:messageId>
<common:externalMessageType>securityAddRequest</common:externalMessageType> <!-- must have value securityAddRequest -->
<common:applicationHistory>
<common:originatorReference>
<common:originator>GLOBAL PLUS</common:originator> <!-- must have value GLOBAL PLUS -->
<common:reference>ABCDE001</common:reference>
<common:primaryReferenceType>GREF</common:primaryReferenceType> <!-- must have value GREF -->
</common:originatorReference>
</common:applicationHistory>
</senderInfo>
</acknowledgement>
Validation.xsd
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:common="http://sungardams.com/common.xsd"
targetNamespace="http://sungardams.com/Validation.xsd"
elementFormDefault="qualified">
<xs:import namespace="http://sungardams.com/common.xsd"
schemaLocation="antCommon.xsd"/>
<xs:element name="acknowledgement">
<xs:complexType>
<xs:sequence>
<xs:element name="type" type="xs:string" fixed="POSITIVE" />
<xs:element name="originReference">
<xs:complexType>
<xs:sequence>
<xs:element name="externalMessageId" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="requestMessageId" type="xs:string" />
<xs:element name="senderInfo" type="common:CType_SenderInfo_ant" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
antCommon.XSD
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://sungardams.com/common.xsd"
elementFormDefault="qualified">
<xs:complexType name="CType_SenderInfo_ant">
<xs:sequence>
<xs:element name="messageId" type="xs:string" />
<xs:element name="externalMessageType" type="xs:string"
fixed="securityAddRequest" />
<xs:element name="applicationHistory">
<xs:complexType>
<xs:sequence>
<xs:element name="originatorReference">
<xs:complexType>
<xs:sequence>
<xs:element name="originator" type="xs:string"
fixed="GLOBAL PLUS" />
<xs:element name="reference" type="xs:string" />
<xs:element name="primaryReferenceType"
type="xs:string" fixed="GREF" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>