Когда речь идет о расширении существующей XML-схемы, есть несколько вариантов.
Использование базовой схемы
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Root" type="RootType" />
<xs:complexType name="RootType">
<xs:sequence>
<xs:element name="OriginalContent" />
</xs:sequence>
</xs:complexType>
</xs:schema>
Extension / ограничение
Вы можете расширять / ограничивать тип, что эффективно создает новый тип с дополнительными / меньшими элементами / атрибутами, однако нет способа принудительно использовать этот новый тип. Создатель XML может сказать вам, что он использует свой новый тип, используя xsi: type = "MyCustomType", но вы не можете настаивать на его использовании.
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation=".\Root.xsd" />
<xs:complexType name="MyNewRoot">
<xs:complexContent>
<xs:extension base="RootType">
<xs:sequence>
<xs:element name="AdditionalElement" type="xs:string" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
Пример XML-файла
<?xml version="1.0" encoding="utf-8"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="Extension.xsd"
xsi:type="MyNewRoot">
<OriginalContent />
<AdditionalElement/>
</Root>
Заново
Другой альтернативой является использование <redefine>
. В основном заменяет определение RootType, поэтому везде, где появляется RootType, теперь должна использоваться наша новая версия.
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:redefine schemaLocation="root.xsd">
<xs:complexType name="RootType">
<xs:complexContent>
<xs:extension base="RootType">
<xs:sequence>
<xs:element name="MyContent" type="xs:string" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:redefine>
</xs:schema>
Пример XML-файла
<?xml version="1.0" encoding="utf-8"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Redefine.xsd">
<OriginalContent></OriginalContent>
<MyContent>stuff</MyContent>
</Root>
Любой
Другое решение - включить xs:any
в определение базовых элементов. Однако это невозможно, если вы не управляете базовой схемой.
Открытый контент
** Доступно только в XSD 1.1 **
Открытый контент был добавлен специально, чтобы позволить вам создавать открытые схемы, он имеет чередование и суффикс режима 2 '. Когда установлено чередование, дополнительные элементы (соответствующие содержанию xs: any) могут чередоваться через элемент (до, между и после любого из существующих элементов).
В суффиксном режиме дополнительные элементы (соответствующие содержанию xs: any) могут быть добавлены после существующих элементов.
OpenContent может применяться к конкретным complexTypes или к уровню схемы, в котором он применяется ко всем элементам, объявленным в нем.
Если вы используете XSD 1.1, это определенно способ сделать ваши схемы расширяемыми, однако XSD 1.1 все еще не очень хорошо поддерживается.
<xs:complexType name="BookType">
<xs:openContent mode="interleave">
<xs:any />
</xs:openContent>
<xs:sequence>
<xs:element name="Title" type="xs:string" />
<xs:element name="Author" type="xs:string" maxOccurs="unbounded" />
<xs:element name="ISBN" type="xs:string" />
</xs:sequence>
</xs:complexType>
Следует также отметить, что если вы чередуете элементы между сериями существующих элементов (т. Е. Title, Author, NewElement , Author, ISBN), то большинство синтаксических анализаторов будут воспринимать второго Author как «новый». элемент и проверить его, используя правила openContent, а не xs: имя элемента = "Author" type = "xs: string" , более того, если у Author было minOccurs 2, это предложение может завершиться ошибкой, так как он видит 1xAuthor , 1xNewElement, 1xAuthor и первый 1xAuthor не для полного предложения minoccurs.
Краткое описание
У всех этих методов есть свои взлеты и падения, но наличие хорошего XML Editor значительно упрощает понимание того, что происходит.
Я рекомендую Liquid XML Studio , которая сделана моей компанией , так как она имеет хороший XSD-редактор, может создавать образцы XML из ваших схем, делая легко увидеть результат вашей работы, а XML Intellisense позволяет легко увидеть действительные параметры.