Xml 如何使用自定义元素扩展基本架构,同时保持打开状态以从新版本进行更改?

Xml 如何使用自定义元素扩展基本架构,同时保持打开状态以从新版本进行更改?,xml,xsd,xsd-validation,Xml,Xsd,Xsd Validation,给定一个XSD,如下所示: <xs:schema elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:std="http://..." targetNamespace="..."> <xs:element name="SomeRootNode" type="std:SomeRootNodeTyp

给定一个XSD,如下所示:

<xs:schema elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"  xmlns:std="http://..." targetNamespace="...">
  <xs:element name="SomeRootNode" type="std:SomeRootNodeType" />
  ...
</xs:schema>

...
它定义了一些元素,这些元素允许来自不同命名空间的任何子级

我想用我自己的模式扩展这个模式,并在基础文档中插入子元素和特定元素的属性。例如,MyLementx或myAttributeY必须具有父节点std:SomeRootNode。然后,组合文档应该能够允许任何第三方继续以基本架构已经允许的任何方式扩展文档,但是对于我的名称空间中的元素和属性,我希望验证所有元素和属性是否具有正确的父节点,并且仅显示在基础文档中允许的位置

如何做到这一点


我希望有一个干净的解决方案,它不会求助于重新定义我正在扩展的基本模式。如果发布了基本模式的新版本,我希望能够轻松地进行调整。我不希望每次发布新版本的基础文档时都要用新的重新定义来更改我的文档(除非它对我的设计有突破性的更改)。

在扩展现有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>

还应注意,如果在现有元素(即Title、Author、NewElement、Author、ISBN)的运行之间交错元素,那么大多数解析器将第二个Author视为“新”元素,并使用openContent规则而不是xs:element name=“Author”type=“xs:string”对其进行验证,此外,如果作者的minOccurs为2,该子句可能会失败,因为它的sight 1xauther、1xNewElement、1xAuthor和第一个1xAuthor没有完全使用minoccurs子句

总结 所有这些方法都有起有落,但有了一个好的方法,就更容易弄清楚发生了什么

我推荐由我的公司制作的,因为它有一个很好的XSD编辑器,可以从您的模式中查看,这样可以很容易地看到您的工作结果,而且XML Intellisense也可以很容易地看到有效的选项

<?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 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>
<?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 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: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>