2016年11月5日 星期六

Schema elementFormDefault、attributeFormDefault

※elementFormDefault

※Test.xsd

<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="!@#"
    xmlns:a="!@#" 
    elementFormDefault="qualified">
    
    <element name="root">
        <complexType>
            <sequence>
                <element name="q1" type="a:t1" />
                <element name="q2" type="a:t2" />
            </sequence>
        </complexType>
    </element>
    
    <complexType name="t1">
        <sequence>
            <element name="s1" type="string" />
            <element name="s2" type="a:t2" />
        </sequence>
    </complexType>
    
    <complexType name="t2">
        <sequence>
            <element name="s3" type="string" />
        </sequence>
    </complexType>
</schema>

※上一篇的xsd裡面都沒有使用xmlns,這裡因為自己也會用到,所以要加

※root裡有q1和q2,型態是自定的t1和t2,將root寫在t1和t2上面也是可以的

※這裡的意思是說,q1下有s1和s3;q2下有s3

※elementFormDefault有兩個值是qualified和unqualified(預設)
還有分全域和區域的element
全域的就是element="root"那一層,以下的element都是區域

qualified表示使用這裡的元素時,使不使用前綴都可以,但要用就全部都要用(包括全域)
unqualified表示使用這裡的元素時,區域一定不可使用前綴;全域一定要使用前綴

※Test.xml

<aa:root  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="!@# Test.xsd"
    xmlns:aa="!@#">
    
    <aa:q1>
        <aa:s1></aa:s1>
        <aa:s2>
            <aa:s3></aa:s3>
        </aa:s2>
    </aa:q1>
    <aa:q2>
        <aa:s3></aa:s3>
    </aa:q2>
</aa:root>

※如果Test.xsd的elementFormDefault是qualified,加不加「aa:」都可以(全域、區域)


※Test.xml

<aa:root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="!@# Test.xsd"
    xmlns:aa="!@#">
    
    <q1>
        <s1></s1>
        <s2>
            <s3></s3>
        </s2>
    </q1>
    <q2>
        <s3></s3>
    </q2>
</aa:root>

※如果Test.xsd的elementFormDefault是unqualified,區域的q1、q2、s1~s3不能加「aa:」

※由於不能加就不曉得是哪個命名空間,所以都建議用qualified,用eclipse預設產生出來的也是qualified



※全域element

再舉個例子,全部都是全域的element

※Test.xsd

<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="!@#"
    xmlns:a="!@#" elementFormDefault="qualified">
    
    <element name="out" type="a:t1" />
    
    <element name="root">
        <complexType>
            <sequence>
                <element ref="a:out" />
            </sequence>
        </complexType>
    </element>
    
    <complexType name="t1">
        <sequence>
            <element name="s1" type="string" />
            <element name="s2" type="a:t2" />
        </sequence>
    </complexType>
    
    <complexType name="t2">
        <sequence>
            <element name="s3" type="string" />
        </sequence>
    </complexType>
</schema>

※ref連到全域的out,而out是全域的


※Test.xml

<aa:root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="!@# Test.xsd" 
    xmlns:aa="!@#">
    
    <aa:out>
        <aa:s1>a:s1</aa:s1>
        <aa:s2>
            <aa:s3>a:s3</aa:s3>
        </aa:s2>
    </aa:out>
</aa:root>

※如果Test.xsd的elementFormDefault是qualified,加不加「aa:」都可以(全域、區域)


※Test.xml

<aa:root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="!@# Test.xsd" xmlns:aa="!@#">
    
    <aa:out>
        <s1>a:s1</s1>
        <s2>
            <s3>a:s3</s3>
        </s2>
    </aa:out>
</aa:root>

※如果Test.xsd的elementFormDefault是unqualified,區域的s1~s3不能加「aa:」



※attributeFormDefault

和elementFormDefault是針對元性,這裡是針對屬性
屬性一定是元素的其中之一,所以建議是unqualified,用eclipse預設不會產生attributeFormDefault,而attributeFormDefault預設值就是unqualified


※Test.xsd

<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="!@#"
    xmlns:a="!@#" 
    elementFormDefault="qualified"
    attributeFormDefault="unqualified">
    
    <element name="root1">
        <complexType>
            <sequence>
                <element name="first" type="string" />
                <element name="second">
                    <complexType>
                        <attribute name="r3" type="string" use="required" />
                    </complexType>
                </element>
                <element name="third" type="a:root2" />
            </sequence>
    
            <attribute name="r1" type="string" use="required" />
            <attribute name="r2" type="string" use="required" />
        </complexType>
    </element>
    
    <complexType name="root2">
        <attribute name="r1" type="int" use="required" />
        <attribute name="r2" type="int" use="required" />
    </complexType>
</schema>

※元素root1有屬性r1和r2;子元素second有屬性r3

※子元素third連到外部屬性root2,也有r1、r2兩個屬性


※Test.xml

<a:root1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="!@# Test.xsd"
    xmlns:a="!@#"
    r1="" 
    r2="">
    
    <a:first>a:first</a:first>
    <a:second r3="" />
    <a:third r1="1" r2="2"></a:third>
</a:root1>

※如果Test.xsd的attributeFormDefault是unqualified,所有的區域屬性都不能加「a:」


※Test.xml

<a:root1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="!@# Test.xsd"
    xmlns:a="!@#"
    a:r1="" 
    a:r2="">
    
    <a:first>a:first</a:first>
    <a:second a:r3="" />
    <a:third a:r1="0" a:r2="0" />
</a:root1>

※如果Test.xsd的attributeFormDefault是qualified,所有的屬性都要加「a:」(全域、區域)



※全域attribute

※Test.xsd

<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="!@#"
    xmlns:a="!@#" 
    elementFormDefault="qualified"
    attributeFormDefault="unqualified">
    
    <element name="root1">
        <complexType>
            <sequence>
                <element name="first" type="string" />
                <element name="second">
                    <complexType>
                        <attribute ref="a:out" use="required" />
                    </complexType>
                </element>
                <element name="third" type="a:root2" />
            </sequence>
    
            <attribute name="r1" type="string" use="required" />
            <attribute ref="a:out" use="required" />
        </complexType>
    </element>
    
    <complexType name="root2">
        <attribute name="r1" type="int" use="required" />
        <attribute name="r2" type="int" use="required" />
    </complexType>
    
    <attribute name="out" type="string" />
</schema>

※和上面的程式相比較,多了out的全域屬性,然後root1和second都連到外部的out


※Test.xml

<a:root1 a:out="" r1="" xmlns:a="!@#"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="!@# Test.xsd">
    
    <a:first>a:first</a:first>
    <a:second a:out="" />
    <a:third r1="0" r2="0" />
</a:root1>

※如果Test.xsd的attributeFormDefault是qualified,還是和剛剛一構,所有的屬性都要加「a:」(全域、區域)

※如果Test.xsd的attributeFormDefault是unqualified,所有的區域屬性都不能加「a:」,但out是全域屬性,還是要加「a:」

沒有留言:

張貼留言