Xsd 如何创建一个可重用的;“美国国家”;键入XML模式?

Xsd 如何创建一个可重用的;“美国国家”;键入XML模式?,xsd,enumeration,Xsd,Enumeration,我有一个包含多个地址的XML模式: <xs:element name="personal_address" maxOccurs="1"> <!-- address fields go here --> </xs:element> <xs:element name="business_address" maxOccurs="1"> <!-- address fields go here --> </xs:element>

我有一个包含多个地址的XML模式:

<xs:element name="personal_address" maxOccurs="1">
  <!-- address fields go here -->
</xs:element>
<xs:element name="business_address" maxOccurs="1">
  <!-- address fields go here -->
</xs:element>

在每个地址元素中,我包括一个“美国州”枚举:

<xs:simpleType name="state">
    <xs:restriction base="xs:string">
        <xs:enumeration value="AL" />
        <xs:enumeration value="AK" />
        <xs:enumeration value="AS" />
                ....
            <xs:enumeration value="WY" />
        </xs:restriction>
</xs:simpleType>

....
如何编写一次“US State”枚举并在每个address元素中重新使用它?如果这是一个n00b问题,我提前道歉——我以前从未写过XSD

我的初步尝试如下:

<xs:element name="business_address" maxOccurs="1">
  <!-- address fields go here -->
  <xs:element name="business_address_state" type="state" maxOccurs="1"></xs:element>
</xs:element>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.org/foo"
    xmlns:tns="http://www.example.org/foo"
    elementFormDefault="qualified">
    <xs:element name="business_address">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="business_address_state"
                    type="tns:state" maxOccurs="1" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:simpleType name="state">
        <xs:restriction base="xs:string">
            <xs:enumeration value="AL" />
            <xs:enumeration value="AK" />
            <xs:enumeration value="AS" />
            <xs:enumeration value="WY" />
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

我认为你的思路是对的。我认为它更多地与XML名称空间有关。请尝试以下操作:

<xs:element name="business_address" maxOccurs="1">
  <!-- address fields go here -->
  <xs:element name="business_address_state" type="state" maxOccurs="1"></xs:element>
</xs:element>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.org/foo"
    xmlns:tns="http://www.example.org/foo"
    elementFormDefault="qualified">
    <xs:element name="business_address">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="business_address_state"
                    type="tns:state" maxOccurs="1" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:simpleType name="state">
        <xs:restriction base="xs:string">
            <xs:enumeration value="AL" />
            <xs:enumeration value="AK" />
            <xs:enumeration value="AS" />
            <xs:enumeration value="WY" />
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

请注意,类型是tns:state而不仅仅是state

然后这就是你将如何使用它:

<?xml version="1.0" encoding="UTF-8"?>
<business_address xmlns="http://www.example.org/foo"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.example.org/foo foo.xsd ">
    <business_address_state>AL</business_address_state>
</business_address>

艾尔

请注意,此XML使用的默认名称空间与XSD的targetNamespace相同,而名称空间有助于组织架构并防止冲突, 上面的名称空间不允许重用, 它是将类型放置为根的直接子级 这使它成为一种全局类型。(可在命名空间内使用,不带命名空间限定符,也可在tns命名空间可见的任何地方使用,带tns:限定符。)

我更喜欢按照“伊甸园”方法构建模式,这种方法可以最大限度地重用元素和类型(也可以方便从数据库中存储的数据字典中对精心制作的唯一类型/元素进行外部逻辑引用)

请注意,虽然“伊甸园”模式提供了最大程度的重用,但它也涉及最多的工作。在本文的底部,我提供了博客系列中涉及的其他模式的链接

•伊甸园方法 通过全局定义所有元素使用模块化方法,并且与Venetian Blind方法一样,所有类型定义都是全局声明的。每个元素全局定义为节点的直接子元素,其类型属性可以设置为一个命名的复杂类型。

相反,为了从规范粒子构造模式,SQLServer2005提供

SELECT xml_schema_namespace function

ca·非·i·卡尔 与数学有关。(指方程、坐标等) “以最简单或标准的形式”

其他更容易构建但不太可恢复/更“非规范化/冗余”的模式模式包括

•俄罗斯玩偶方法 架构只有一个全局元素—根元素。所有其他元素和类型都被嵌套得越来越深,并赋予其名称,因为每个类型都与上面的类型相匹配。由于此设计中的元素是在本地声明的,因此它们将无法通过导入或include语句重用

•意大利腊肠切片法 所有元素都是全局定义的,但类型定义是在本地定义的。通过这种方式,其他架构可以重用元素。使用这种方法,具有本地定义类型的全局元素提供元素内容的完整描述。此信息“切片”单独声明,然后聚合在一起,也可以可以拼凑起来构建其他模式

•威尼斯盲法
与俄罗斯玩偶方法类似,它们都使用单个全局元素。威尼斯盲法通过全局命名和定义所有类型定义来描述模块化方法(与Salami Slice方法相反,Salami Slice方法全局声明元素,局部声明类型)。每个全局定义的类型描述一个单独的“slat”并且可以被其他组件重用。此外,所有本地声明的元素可以是命名空间限定的或命名空间非限定的(板条可以是“打开”或“关闭的”)取决于架构顶部的elementFormDefault属性设置。

阅读后,我认为我不需要添加与命名空间相关的属性。此应用程序将在隔离的环境中运行。省略它是否不好?如果在XML实例中使用默认命名空间,则不必使用命名空间前缀。见我上面的例子。