• 8.【xml schema】几点问题区分


    1.simpleType 和 complexType的区别

    这两个使用的范围不一样,一个是简单类型包括 xs:element 和 xs:attribute
    在设置简单类型限制(restriction)的时候使用xs:simpleType

    2.simpleContent 和 complexContent

    simpleContent 是对简单元素的扩展 complexContent 是对复杂元素的扩展

    <xs:element name="message">
      <xs:complexType>
       <xs:complexContent>
        <xs:extension base="personinfo">//限定的是下面complexType定义的类型
         <xs:sequence>
          <xs:element name="h"/>
         </xs:sequence>
         <xs:attribute name="date" type="xs:date"/>
        </xs:extension>
       </xs:complexContent>
      </xs:complexType>
     </xs:element>
    
     <xs:complexType name="personinfo">
      <xs:sequence>
       <xs:element name="firstname" type="xs:string"/>
       <xs:element name="lastname" type="xs:string"/>
      </xs:sequence>
     </xs:complexType>

    <xs:element name="message">
     <xs:complexType>
      <xs:simpleContent>
       <xs:extension base="xs:string">
        <xs:attribute name="date" type="xs:date"/>
       </xs:extension>
      </xs:simpleContent>
     </xs:complexType>
    </xs:element>

    参考 http://coresun.blog.sohu.com/73396995.html

    <xsd:simpleContent>和<xsd:complexContent>这两个标签都不能单独使用,经常和 <xsd:extension>、<xsd:retriction>、<xsd:complexType>、<xsd:simpleType>嵌套使用。

    demo

    xs:simpleType name="price">
    	<xs:restriction base="xs:decimal">
    		<xs:maxInclusive value="100"/>
    		<xs:minInclusive value="0"/>
    	</xs:restriction>
    </xs:simpleType>
    
    <xs:simpleType name="currency">
    	<xs:restriction base="xs:string">
    		<xs:enumeration value="$"/>
    		<xs:enumeration value="Y"/>
    	</xs:restriction>
    </xs:simpleType>
    
    <xs:complexType name="complex1">
    	<xs:simpleContext>
    		<xs:extension base="price">
    			<xs:attribute  name="simple_price" type="currency">
    		</xs:extension>
    	</xs:simpleContext>
    </xs:complexType>

    上面例子中 先定义了两个simpleType (用来做simple 元素的限制) 然后通过extension的方式扩展 上面 complexType 定义的元素内容0-100之间 attribute 是 simple_price 是 ($|Y)的一个

    <xs:complexType name="complex2">
    	<xs:simpleContent>
    		<xs:restriction base="complex1">
    			<xs:maxInclusive value="1000"/>
    		</xs:restriction>
    	</xs:simpleContent>
    </xs:complexType>

    上面的更新了 complex1 将最大值扩大到1000

    DEMO2

    xs:complexType name="complex1">
    	<xs:sequence>
    		<xs:element name="street" type="xs:string"/>
    		<xs:element name="city" type="xs:string"/>
    	</xs:sequence>
    </xs:complexType>
    
    <xs:complexType name="complex2">
    	<xs:complexContent>
    		<xs:extension base="complex1">
    			<xs:sequence>
    				<xs:element name="state" type="xs:string"/>
    				<xs:element name="country" type="xs:string" fixed="US"/>
    			</xs:sequence>
    			<xs:attribute name="" type="xs:string"/ >
    		</xs:extension>
    	</xs:complexContent>
    </xs:complexType>

    #complex2 有四个元素 而且含有一个attribute

    也可以使用restriction

    <xs:complexType name="complex2">
    	<xs:complexContent>
    		<xs:restriction base="complex1">
    			<xs:sequence>
    				<xs:element name="street" type="xs:string" fixed="wow"/>
    				<xs:element name="city" type="xs:string"/>
    			</xs:sequence>
    			<xs:attribute name="" type="xs:string"/ >
    		</xs:restriction>
    	</xs:complexContent>
    </xs:complexType>

    street 设定成 fixed值


    3.ref include 的使用

    两个语法

    There are two methods for this. <xsd:include schemaLocation="pathToFile" /> should be used for including files of the same namespace. <xsd:import namespace="namespace" schemaLocation="pathToFile" /> should be used for include files in a different namespace. Usually you will specify the namespace given as the targetNamespace of the imported schema.

    另外一个回答参考

    The fundamental difference between include and import is that you must use import to refer to declarations or definitions that are in a different target namespace and you must use include to refer to declarations or definitions that are (or will be) in the same target namespace.

    参考 https://web.archive.org/web/20070804031046/http://xsd.stylusstudio.com/2002Jun/post08016.htm

    找到一个中文博文也说明问题

    http://blog.csdn.net/tuolingss/article/details/8557328

    关于 ref 和type 的区别 参考了一下 stackoverflow 的一个回答

    参考

    https://stackoverflow.com/questions/17422175/whats-the-difference-between-ref-and-type-in-an-xml-schema

    Using ref=".." you are "pasting" existing element/attribute defined on the other place. Using type=".." you are assigning some structure (defined in complextype/simpletype) to new element/attribute. Look at following:

    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tst="test" targetNamespace="test">
    
        <xs:complexType name="Root">
            <xs:sequence>
                <xs:element ref="tst:Child" />
                <xs:element name="Child2" type="tst:ChildType" />
            </xs:sequence>
            <xs:attribute ref="tst:AttRef" />
            <xs:attribute name="Att2" type="tst:AttType" />
        </xs:complexType>
    
        <xs:complexType name="ChildType">
            <xs:attribute ref="tst:AttRef" />
        </xs:complexType>
    
        <xs:element name="Child">
        </xs:element>
    
        <xs:simpleType name="AttType">
            <xs:restriction base="xs:string">
                <xs:maxLength value="10" />
            </xs:restriction>
        </xs:simpleType>
    
        <xs:attribute name="AttRef" type="xs:integer" />
    
    </xs:schema>

    Yes I think it could be said in this way (if "instance" mean some top-level element declared somewhere in xsd). Another difference: when you use type then you can have two element with different name with the same structure. When you use ref then you have elements with either same name or structure everywhere. – Jirka Š.

    简单的讲 ref 就是直接调用 已经定义好的 element 而 type 相当于应用了结构 name 肯定要自己写 和 integer string 一样的知识使用我们自己定义的 simpleType 或者 complexType

    另外一个参考 https://coderanch.com/t/127287/ref-type-XML-Schema

    我测试的例子 如下

    usaddress.xsd 只是一个很简单的element

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    	<xs:element name="USaddress">
    		<xs:complexType>
    			<xs:sequence>
    				<xs:element name="street1" type="xs:string" minOccurs="0"/>
    				<xs:element name="street2" type="xs:string" minOccurs="0"/>
    				<xs:element name="city"    type="xs:string"/>
    				<xs:element name="state"   type="xs:string"/>
    				<xs:element name="zip"     type="xs:string" minOccurs="0"/>
    			</xs:sequence>
    		</xs:complexType>
    	</xs:element>
    </xs:schema>

    #address.xsd

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    	<xs:include schemaLocation="usaddress.xsd"/>
    	<xs:element name="address">
    		<xs:complexType>
    			<xs:sequence>
    				<xs:element name="name" type="xs:string"/>
    				<xs:element ref="USaddress"/>
    			</xs:sequence>
    		</xs:complexType>
    	</xs:element>
    </xs:schema>

    注意上面的xs:include 因为我们在同一个namespace 里面 所已只需要名字即可 ref用法不再赘述

    PHP 验证函数

    <?php
    
    $dom = new DOMDocument;
    $dom->load('test1.xml');
    libxml_use_internal_errors(true);
    if($dom->schemaValidate("address.xsd")){
    	echo "validate";
    }else{
    	var_dump(libxml_get_errors());
    }
    慢慢沉淀自己
  • 相关阅读:
    jvm 垃圾回收
    shell编写一键启动
    jvm内存结构
    java 线程监控
    linux 操作系统级别监控 nmon命令
    linux 操作系统级别监控 vmstat/dstat 命令
    linux 操作系统级别监控 df 命令
    linux 操作系统级别监控 iostat 命令
    linux 操作系统级别监控 free命令
    linux 操作系统级别监控 TOP命令
  • 原文地址:https://www.cnblogs.com/martinding/p/7484834.html
Copyright © 2020-2023  润新知