支持不同名称空间的XSD

时间:2017-03-03 13:52:38

标签: xml xsd

美好的一天!

我按如下方式生成了xml文件:

<object xmlns:el="elements_namespace" xmlns:vlprops="vl_props_namespace"
    xmlns:vlsvc="vl_svc_params_namespace" xmlns:p="general_params_namespace">
    <el:BTN vlprops:link="../clientdb/#abn/fl" vlprops:btnType="hist"
        vlprops:linkInTab="true" p:nm_title="some_text"
        p:vl_order="0" p:nm_service="null" p:pr_visible="true" p:nm_endpoint="null"
        p:nm_logical_id="null" p:nm_description="null">
        <vlprops:linkCols><![CDATA[[]]]></vlprops:linkCols>
        <p:window_BTN />
    </el:BTN>
    <el:GRID vlprops:rows="15" p:nm_title="null" p:vl_order="3"
        p:nm_service="some_text" p:pr_visible="true" p:nm_endpoint="CLDB"
        p:nm_logical_id="some_text" p:nm_description="some_text">
        <vlsvc:vars><![CDATA[["vl_params"]]]></vlsvc:vars>
        <vlsvc:consts><![CDATA[{"in_function": "mdTotalTags"}]]></vlsvc:consts>
        <p:columns_GRID>
            <el:GRDCOL vlprops:rows="15" p:nm_title="null" p:vl_order="0"
                p:nm_service="null" p:pr_visible="true" p:nm_endpoint="null"
                p:nm_logical_id="null" p:nm_description="some_text">
                <vlprops:linkCols><![CDATA[["id_client"]]]></vlprops:linkCols>
            </el:GRDCOL>
            <el:GRDCOL vlprops:rows="15" p:nm_title="some_text"
                p:vl_order="1" p:nm_service="null" p:pr_visible="true"
                p:nm_endpoint="null" p:nm_logical_id="null" p:nm_description="null"></el:GRDCOL>
            <el:GRDCOL vlprops:rows="15" p:nm_title="some_text" p:vl_order="2"
                p:nm_service="null" p:pr_visible="true" p:nm_endpoint="null"
                p:nm_logical_id="null" p:nm_description="null"></el:GRDCOL>
            <el:GRDCOL vlprops:rows="15" p:nm_title="some_text"
                p:vl_order="3" p:nm_service="null" p:pr_visible="true"
                p:nm_endpoint="null" p:nm_logical_id="null" p:nm_description="null"></el:GRDCOL>
            <el:GRDCOL vlprops:rows="15" p:nm_title="some_text" p:vl_order="4"
                p:nm_service="null" p:pr_visible="true" p:nm_endpoint="null"
                p:nm_logical_id="null" p:nm_description="null"></el:GRDCOL>
            <el:GRDCOL vlprops:rows="15" p:nm_title="some_text" p:vl_order="5"
                p:nm_service="null" p:pr_visible="true" p:nm_endpoint="null"
                p:nm_logical_id="null" p:nm_description="null"></el:GRDCOL>
            <el:GRDCOL vlprops:rows="15" p:nm_title="some_text"
                p:vl_order="6" p:nm_service="null" p:pr_visible="true"
                p:nm_endpoint="null" p:nm_logical_id="null" p:nm_description="null"></el:GRDCOL>
            <el:GRDCOL vlprops:rows="15" p:nm_title="some_text почта"
                p:vl_order="7" p:nm_service="null" p:pr_visible="true"
                p:nm_endpoint="null" p:nm_logical_id="null" p:nm_description="null"></el:GRDCOL>
            <el:GRDCOL vlprops:rows="15" p:nm_title="some_text" p:vl_order="8"
                p:nm_service="null" p:pr_visible="true" p:nm_endpoint="null"
                p:nm_logical_id="null" p:nm_description="null"></el:GRDCOL>
        </p:columns_GRID>

        <p:footDetail_GRID />
        <p:rowDetail_GRID />
    </el:GRID>
</object>

现在我需要生成XSD方案,我在网上搜索了一些信息,遇到了一些例子。他们都只有一个命名空间。喜欢

    <?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://www.my.com/book" 
            elementFormDefault="qualified">

    <xs:element name="book">
        <xs:complexType>
            <xs:attribute name="author" type="xs:string"/>
        </xs:complexType> 
    </xs:element>      
</xs:schema>

它只包含xs:namespace,我想知道我是否可以创建一个xsd文件来包含我xml中的所有命名空间

(
el="elements_namespace" 
xmlns:vlprops="vl_props_namespace"
xmlns:vlsvc="vl_svc_params_namespace"
 xmlns:p="general_params_namespace"
)

如果有可能,你可以给我一些我的xml示例吗?提前谢谢

1 个答案:

答案 0 :(得分:0)

XML Schema通常为每个命名空间安排一个模式,但模式可以相互导入。

例如,对于根元素,可以定义没有目标名称空间的第一个模式,从而导入el模式。然后,它可以引用el模式中定义的具有ref属性的元素。

<?xml version="1.0" encoding="utf-8"?>
<xs:schema
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      xmlns:el="elements_namespace">
    <xs:import namespace="elements_namespace" schemaLocation="el.xsd"/>
    <xs:element name="object">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="el:BTN"/>
                <xs:element ref="el:GRID"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

导入和引用元素和属性的相同机制可以在所有模式中重用,除了其他模式将具有目标名称空间。

有一点通常会引起混淆:

  • name属性具有本地名称,没有前缀,因为要在模式的目标命名空间中声明的元素(为此,请确保elementFormDefaultqualified,除非没有目标命名空间的条目架构。
  • ref属性必须包含QNames,前缀为。因此,您需要相应地绑定前缀,如上所述。

最后,建议对名称空间使用URI。 XML Names规范要求这样做,即使在实践中,许多处理器实际上将它们视为字符串并且不会抱怨。