我需要对XML模式进行反规范化,以便为将创建符合模式的文档的某些人生成文档。用户不了解XSD,很可能永远不会学习。我见过的工具能够为其他XSD开发人员生成文档,但我的用户对如何构建模式的细节不感兴趣,他们只想知道他们能够和必须做什么来创建有效的文档。
所以,我正在寻找一种方法来解析所有导入的命名空间,XML模式中的包含和引用,并生成一个非规范化版本,我可以用它(反过来)生成用户文档。
问题:
我能够解决大多数包含和引用。我需要知道的是如何解析所有导入/包含的命名空间以适合单个XSD?
以下是4个相互关联的模式,我希望将所有内容移到" main_schema.xsd"因为那是人们现在提到的那个。 (注意:删除命名空间不是一个选项 - XSD验证的XML文件中的数据具有命名空间)。
成功通过" main_schema.xsd"
验证的示例数据文件<schema_actions xmlns="http://abcd.com/schema/v1" xmlns:id="http://abcd.com/schema/InstrumentMaster/v1" created="2018-01-03T14:21:00.601-05:00" source="abcd">
<event>
<instrument>
<id:code scheme="123">LoremIpsum123</id:code>
<id:code scheme="124">LoremIpsum124</id:code>
<id:code scheme="125">LoremIpsum125</id:code>
<id:code scheme="321">LoremIpsum321</id:code>
<id:code scheme="320">LoremIpsum320</id:code>
</instrument>
</event>
</schema_actions>
main_schema.xsd
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="v1.0" targetNamespace="http://abcd.com/schema/v1">
<xs:include schemaLocation="data_format_schema.xsd"/>
</xs:schema>
data_format_schema.xsd
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:uca="http://abcd.com/schema/v1" xmlns:id="http://abcd.com/schema/InstrumentMaster/v1" xmlns:meta="http://abcd.com/schema/outgoing/v1" elementFormDefault="qualified" attributeFormDefault="unqualified" version="v1.0">
<xs:import namespace="http://abcd.com/schema/outgoing/v1" schemaLocation="outgoing.xsd"/>
<xs:import namespace="http://abcd.com/schema/InstrumentMaster/v1" schemaLocation="master_information.xsd"/>
<xs:element name="schema_actions">
<xs:complexType>
<xs:sequence>
<xs:element ref="event" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attributeGroup ref="meta:outgoing"/>
</xs:complexType>
</xs:element>
<xs:element name="event" type="Trigger_Action"/>
<xs:complexType name="Trigger_Action">
<xs:sequence>
<xs:element name="instrument" type="id:Instrument"/>
</xs:sequence>
<xs:attributeGroup ref="meta:outgoing"/>
</xs:complexType>
</xs:schema>
master_information.xsd
<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xdb="http://xmlns.oracle.com/xdb" xmlns:uca="http://abcd.com/schema/InstrumentMaster/v1" targetNamespace="http://abcd.com/schema/InstrumentMaster/v1" elementFormDefault="qualified" attributeFormDefault="unqualified" version="v1.0">
<xs:complexType name="Code">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="scheme" type="xs:string"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="Instrument">
<xs:sequence>
<xs:element name="code" type="uca:Code" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
outgoing.xsd
<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xdb="http://xmlns.oracle.com/xdb" targetNamespace="http://abcd.com/schema/outgoing/v1" elementFormDefault="qualified" attributeFormDefault="unqualified" version="v1.0">
<xs:attributeGroup name="outgoing">
<xs:attribute name="source" fixed="abcd" use="optional"/>
<xs:attribute name="created" type="xs:dateTime" use="optional"/>
<xs:anyAttribute processContents="lax"/>
</xs:attributeGroup>
</xs:schema>
非常感谢对此的任何见解!
答案 0 :(得分:1)
XSD语法要求如果两个全局声明具有不同的目标命名空间,则声明将出现在不同的架构文档中。您可以按照自己喜欢的方式将声明合并到单个文件中,但该文件不是XSD架构文档。
答案 1 :(得分:1)
当我需要生成(或以其他方式处理)一组模式文档的文档时,我通常将它们全部放入一个XML文档中,作为包装元素的子项,我给它命名为collection
。 (嗯,实际上,这不是真的;我通常将每个xsd:schema
元素包装在父元素中,其中包含有关从中检索架构文档的URI的信息,检索的日期和时间以及其他任何内容我认为在问题出现后六六个月后会有所帮助,我必须再次看一下。)
正如Michael Kay所说,这个XML文档不是XSD架构文档;它是一个包含多个XSD架构文档的XML文档。并非所有支持XSD的软件都能很好地处理这样的集合(尽管XSD规范中没有任何内容要求xsd:schema
元素是其XML文档的最外层元素),但是如果您要将代码写入生成文档,不用担心。