РЕДАКТИРОВАТЬ: Основываясь на моем чтении, я думаю, что мне нужно попробовать что-то вроде этого ... Как расширить сложный тип в другом пространстве имен без изменения имени Я еще не попробовал, но обновлю, если я добиться успеха с этим методом ...
Итак, у меня есть проект, в котором у меня есть массивный XSD, предоставленный третьей стороной, и я хотел бы добавить свои собственные элементы и атрибуты в XSD. Я хотел бы добавить элемент в substitutiongroup = "SpecificResource", а также атрибут.
Давайте назовем более крупный сторонний xsd "base.xsd", я сократил его до частей, которые я считаю имеют отношение к примеру.
<xs:schema targetNamespace="http://www.base.com"
xmlns="http://www.base.com"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:element abstract="true" name="SpecificResource" type="SpecificResource"/>
<xs:complexType abstract="true" name="SpecificResource">
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<xs:element name="FileSpec">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="1" minOccurs="0" ref="Disposition"/>
<xs:element maxOccurs="unbounded" minOccurs="0" ref="NetworkHeader"/>
</xs:sequence>
<xs:attribute name="Example" type="xs:string" use="optional"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
</xs:element>
И мой пользовательский xsd с именем "Custom.xsd"
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:cus="https://www.custom.com"
xmlns="http://www.base.com"
targetNamespace="https://www.custom.com"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:import namespace="https://www.base.com" schemaLocation="base.xsd"/>
<xs:attribute name="URL" type="xs:string"/>
<xs:attribute name="customattribute" type="xs:NMTOKEN"/>
<xs:element name="SpecRes1" substitutionGroup="SpecificResource" type="cus:SpecRes1"/>
<xs:complexType name="SpecRes1">
<xs:complexContent>
<xs:extension base="SpecificResource">
<xs:attribute ref="cus:customattribute"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name ="fullfilespec">
<xs:complexContent>
<xs:extension base="FileSpec">
<xs:attribute ref="URL" use="optional"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
Однако, сейчас я получаю "Undefined complexType 'http://www.base.com : FileSpe c 'используется в качестве основы для расширения сложного типа. " Я не понимаю, почему, как мне кажется, Filespe c определен в файле base.xsd.
Я что-то не так делаю, когда дело доходит до импорта?
Последующий вопрос: есть ли способ заставить Imported XSD не требовать префиксов, в то время как добавление элементов, которые я добавил, требует префикса пространства имен (cus :) В настоящее время я смог добавить свой элемент в «SpecificResource», но мой элемент, кажется, определен в Пространство имен base.xsd, которое я не думаю, то, что я хочу. Когда я использую XSD, я получаю файл, который действителен без добавления префиксов в добавленные элементы, что затрудняет различие между тем, что я добавил, и тем, что уже существовало. (Я генерирую файл класса из xsd, а также сериализую и десериализирую данные с его помощью.)
Я использовал этот подход для импорта базового xsd, чтобы мне не нужно было трогать файл base.xsd, но разве невозможно расширить импортированные элементы в вашем пользовательском пространстве имен?
Я изначально добавлял в base.xsd и импортировал свой custom.xsd, но становится очень утомительно продолжать добавлять в base.xsd, хотя затрудняет добавление в группу замещения SpecificResource.