【问题标题】:What is the intended effect of importing/including an XSD into another XSD file when generating an XML file from XSD?从 XSD 生成 XML 文件时,将 XSD 导入/包含到另一个 XSD 文件的预期效果是什么?
【发布时间】:2022-08-24 02:40:06
【问题描述】:

当我从包含一个或多个 XSD 文件的 XSD 文件生成 XML 文件时,生成的 XML 文件是否应该也包含从 XSD 文件生成的 XML?

蛋糕.xsd:

<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"
           xmlns=\"https://www.examle.com/bakery\"
           targetNamespace=\"https://www.examle.com/bakery\"
           elementFormDefault=\"qualified\">
    <xs:include schemaLocation=\"bakery.xsd\"/>
    <xs:include schemaLocation=\"cakeType.xsd\"/>
    <xs:element name=\"Cake\">
        <xs:complexType>
            <xs:all>
                <xs:element name=\"cakeName\" type=\"xs:string\" minOccurs=\"1\" maxOccurs=\"1\"/>
                <xs:element name=\"cakeType\" type=\"cakeType\" minOccurs=\"0\"/>
                <xs:element name=\"ingredients\" type=\"xs:string\" minOccurs=\"0\"/>
                <xs:element name=\"instructions\" type=\"xs:string\" minOccurs=\"0\"/>
            </xs:all>
        </xs:complexType>
    </xs:element>
</xs:schema>

面包店.xsd:

<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"
           xmlns=\"https://www.examle.com/bakery\"
           targetNamespace=\"https://www.examle.com/bakery\"
           elementFormDefault=\"qualified\">
    <xs:element name=\"Bakery\">
        <xs:complexType>
            <xs:all>
                <xs:element name=\"guid\" type=\"xs:string\" minOccurs=\"1\" maxOccurs=\"1\"/>
                <xs:element name=\"creationDate\" type=\"xs:dateTime\" minOccurs=\"1\" maxOccurs=\"1\"/>
                <xs:element name=\"update\" minOccurs=\"1\" maxOccurs=\"1\">
                    <xs:complexType>
                        <xs:all>
                            <xs:element name=\"updateBy\" type=\"xs:string\" minOccurs=\"1\" maxOccurs=\"1\"/>
                            <xs:element name=\"updateDate\" type=\"xs:dateTime\" minOccurs=\"1\" maxOccurs=\"1\"/>
                        </xs:all>
                    </xs:complexType>
                </xs:element>
                <xs:element name=\"name\" type=\"xs:string\" minOccurs=\"1\" maxOccurs=\"1\"/>
                <xs:element name=\"description\" type=\"xs:string\" minOccurs=\"0\" maxOccurs=\"1\"/>
            </xs:all>
        </xs:complexType>
    </xs:element>
</xs:schema>

cakeType.xsd:

<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"
           xmlns=\"https://www.examle.com/bakery\"
           targetNamespace=\"https://www.examle.com/bakery\"
           elementFormDefault=\"qualified\">
    <xs:element name=\"CakeType\"/>
    <xs:simpleType name=\"cakeType\">
        <xs:restriction base=\"xs:token\">
            <xs:enumeration value=\"angel\"/>
            <xs:enumeration value=\"pound\"/>
            <xs:enumeration value=\"cheese\"/>
            <xs:enumeration value=\"chiffon\"/>
            <xs:enumeration value=\"genoise\"/>
            <xs:enumeration value=\"sponge\"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

我了解生成的 XML 文件如下所示:

cake.xsd.xml:

<bak:Cake xmlns:bak=\"https://www.examle.com/bakery\">
  <bak:cakeName>string</bak:cakeName>
  <!--Optional:-->
  <bak:cakeType>chiffon</bak:cakeType>
  <!--Optional:-->
  <bak:ingredients>string</bak:ingredients>
  <!--Optional:-->
  <bak:instructions>string</bak:instructions>
</bak:Cake>

面包店.xsd.xml:

<bak:Bakery xmlns:bak=\"https://www.examle.com/bakery\">
  <bak:guid>string</bak:guid>
  <bak:creationDate>2008-09-28T19:49:45</bak:creationDate>
  <bak:update>
    <bak:updateBy>string</bak:updateBy>
    <bak:updateDate>2014-09-18T17:18:33</bak:updateDate>
  </bak:update>
  <bak:name>string</bak:name>
  <!--Optional:-->
  <bak:description>string</bak:description>
</bak:Bakery>

cakeType.xsd.xml:

<bak:CakeType xmlns:bak=\"https://www.examle.com/bakery\">anyType</bak:CakeType>

问题:为什么它不会以这种方式生成 XML 文件?

(它包括所包含的 XSD 文件的生成 XML)

cake.xsd.xml:(不验证)

<bak:Cake xmlns:bak=\"https://www.examle.com/bakery\">
  <bak:Bakery xmlns:bak=\"https://www.examle.com/bakery\">
    <bak:guid>string</bak:guid>
    <bak:creationDate>2008-09-28T19:49:45</bak:creationDate>
    <bak:update>
      <bak:updateBy>string</bak:updateBy>
      <bak:updateDate>2014-09-18T17:18:33</bak:updateDate>
    </bak:update>
    <bak:name>string</bak:name>
    <!--Optional:-->
    <bak:description>string</bak:description>
  </bak:Bakery>
  <bak:CakeType xmlns:bak=\"https://www.examle.com/bakery\">anyType</bak:CakeType>
  <bak:cakeName>string</bak:cakeName>
  <!--Optional:-->
  <bak:cakeType>chiffon</bak:cakeType>
  <!--Optional:-->
  <bak:ingredients>string</bak:ingredients>
  <!--Optional:-->
  <bak:instructions>string</bak:instructions>
</bak:Cake>

编辑:我找到了我正在寻找的答案。为了在 cake XML 生成中包含 bakery 的内容,我将 bakery 更改为一个类型,并为 cake 添加了一个新的 bakery 元素。现在,每当我更改烘焙内容时,它仍会包含在蛋糕 XML 生成中。

更改了 bakery.xsd:

<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"
           xmlns=\"https://www.examle.com/bakery\"
           targetNamespace=\"https://www.examle.com/bakery\"
           elementFormDefault=\"qualified\">
    <xs:element name=\"Bakery\"/>
    <xs:complexType name=\"bakeryType\">
        <xs:all>
            <xs:element name=\"guid\" type=\"xs:string\" minOccurs=\"1\" maxOccurs=\"1\"/>
            <xs:element name=\"creationDate\" type=\"xs:dateTime\" minOccurs=\"1\" maxOccurs=\"1\"/>
            <xs:element name=\"update\" minOccurs=\"1\" maxOccurs=\"1\">
                <xs:complexType>
                    <xs:all>
                        <xs:element name=\"updateBy\" type=\"xs:string\" minOccurs=\"1\" maxOccurs=\"1\"/>
                        <xs:element name=\"updateDate\" type=\"xs:dateTime\" minOccurs=\"1\" maxOccurs=\"1\"/>
                    </xs:all>
                </xs:complexType>
            </xs:element>
            <xs:element name=\"name\" type=\"xs:string\" minOccurs=\"1\" maxOccurs=\"1\"/>
            <xs:element name=\"description\" type=\"xs:string\" minOccurs=\"0\" maxOccurs=\"1\"/>
        </xs:all>
    </xs:complexType>
</xs:schema>

更改 cake.xsd:

<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"
           xmlns=\"https://www.examle.com/bakery\"
           targetNamespace=\"https://www.examle.com/bakery\"
           elementFormDefault=\"qualified\">
    <xs:include schemaLocation=\"bakery.xsd\"/>
    <xs:include schemaLocation=\"cakeType.xsd\"/>
    <xs:element name=\"Cake\">
        <xs:complexType>
            <xs:all>
                <xs:element name=\"bakery\" type=\"bakeryType\"/>
                <xs:element name=\"cakeName\" type=\"xs:string\" minOccurs=\"1\" maxOccurs=\"1\"/>
                <xs:element name=\"cakeType\" type=\"cakeType\" minOccurs=\"0\"/>
                <xs:element name=\"ingredients\" type=\"xs:string\" minOccurs=\"0\"/>
                <xs:element name=\"instructions\" type=\"xs:string\" minOccurs=\"0\"/>
            </xs:all>
        </xs:complexType>
    </xs:element>
</xs:schema>

现在从 cake.xsd 文件生成的 XML 文件验证并包含 bakery 元素:

<bak:Cake xmlns:bak=\"https://www.examle.com/bakery\">
  <bak:bakery>
    <bak:guid>string</bak:guid>
    <bak:creationDate>2008-09-28T19:49:45</bak:creationDate>
    <bak:update>
      <bak:updateBy>string</bak:updateBy>
      <bak:updateDate>2014-09-18T17:18:33</bak:updateDate>
    </bak:update>
    <bak:name>string</bak:name>
    <!--Optional:-->
    <bak:description>string</bak:description>
  </bak:bakery>
  <bak:cakeName>string</bak:cakeName>
  <!--Optional:-->
  <bak:cakeType>cheese</bak:cakeType>
  <!--Optional:-->
  <bak:ingredients>string</bak:ingredients>
  <!--Optional:-->
  <bak:instructions>string</bak:instructions>
</bak:Cake>
  • 从 XSD 模式生成 XML 实例有很多工具,但它不受任何标准的约束,而且它不可避免地是一个有点不可预测的过程,因为有许多不同的实例文档符合任何标准。给定的架构。您需要根据您正在使用的特定软件工具提出问题。

标签: xml xsd-validation


【解决方案1】:

include 元素用于将具有相同目标命名空间的多个模式添加到文档中。

cake.xsd需要cakeType.xsd 生成一个实例,同时它也可能生成一个 Bakery 类型,但并不严格要求它。

从 xsd 生成的 XML 实例将具有已定义的元素,仅此而已,但可能会更少。对于cake.xsd,其中3 个是xs:string 类型,1 个是cakeType 类型,在cakeType.xsd 中定义,但由于&lt;xs:include schemaLocation="cakeType.xsd"/&gt; 而有效,包括:

<xs:element name="Cake">
    <xs:complexType>
        <xs:all>
            <xs:element name="cakeName" type="xs:string" minOccurs="1" maxOccurs="1"/>
            <xs:element name="cakeType" type="cakeType" minOccurs="0"/>
            <xs:element name="ingredients" type="xs:string" minOccurs="0"/>
            <xs:element name="instructions" type="xs:string" minOccurs="0"/>
        </xs:all>
    </xs:complexType>
</xs:element>

cake.xsd 生成返回与 OP 发布的相同
XMLBEANS_LIB='/usr/share/java/xmlbeans/' xsd2inst cake.xsd -name Cake

bakery.xsd 元素不存在于cake.xsd 结构上,因此不会出现在其上,但是,Bakery 实例可以从cake.xsd 生成,因为include

XMLBEANS_LIB='/usr/share/java/xmlbeans/' xsd2inst cake.xsd -name Bakery

结果

<bak:Bakery xmlns:bak="https://www.examle.com/bakery">
  <bak:guid>string</bak:guid>
  <bak:creationDate>2008-09-28T22:49:45</bak:creationDate>
  <bak:update>
    <bak:updateBy>string</bak:updateBy>
    <bak:updateDate>2014-09-18T20:18:33</bak:updateDate>
  </bak:update>
  <bak:name>string</bak:name>
  <!--Optional:-->
  <bak:description>string</bak:description>
</bak:Bakery>

最小的Cake 实例可以是

<bak:Cake xmlns:bak="https://www.examle.com/bakery">
  <bak:cakeName>string</bak:cakeName>
</bak:Cake>

使用xjc 生成代码也会为include xsd 生成类

/home/lmc/projects/bin/jaxb-ri/bin/xjc.sh -p cake cake.xsd
Java major version: 11
parsing a schema...
compiling a schema...
cake/Bakery.java
cake/Cake.java
cake/CakeType.java
cake/ObjectFactory.java
cake/package-info.java

【讨论】:

  • “ bakery.xsd 元素不存在于 cake.xsd 结构中,因此不会出现在其上,但是,由于包含,可以从 cake.xsd 生成 Bakery 实例”:如果 cake.xsd 上不存在 bakery.xsd 元素,为什么还要包括它呢?只有cake 才能生成bakery 实例吗?
  • @DrewShirts 这是一种可能性,但很难确定。可能与他们所在的整个项目有关。
  • @DrewShirts 从 cake.xsd 生成所有代码可能是包含的另一个原因。查看答案更新。
猜你喜欢
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 2011-09-25
  • 2019-11-05
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
相关资源
最近更新 更多