1つは、XMLセマンティック制約です。
1. XMLドキュメントの構造は正しいですが、有効でない可能性があります
たとえば、「植物品種」タグは、従業員ファイルxmlでは許可されません。xmlセマンティック制約は、xmlドキュメントに表示できる要素を指定するために使用されます
2. XMLセマンティック制約を定義するには、 DTDとXMLスキーマの2つの方法があります。
2、DTD
1.定義:DTD(Document Type Definition)は、シンプルで使いやすいセマンティック制約メソッドです。
2、DTDファイル名拡張子は.dtdです
3. DTDの<!ELEMENT>タグを使用して、XMLドキュメントで許可されるノードの数と数を定義できます。例としてhr.xmlを取り上げます。
- hrノードの下で許可される従業員の子ノードは1つだけであることを定義します。
<!ELEMENT hr(employee)>
- 従業員ノードには、次の4つのノードが含まれている必要があり、それらは順番に表示されます。
<!ELEMENT employee(name,age,salary,department)>
- 名前タグの本文はテキストのみにすることができます。#PCDATAはテキスト要素を表します。
<!ELEMENT name (#PCDATA)>
子ノードを複数回繰り返す必要がある場合は、子ノードの後に応答記述子を追加する必要があります
- 少なくとも1つの従業員の子ノードがhrノードの下に表示されます
<!ELEMENT hr(employee+)>
- 0 ... n従業員の子ノードはhrノードの下に表示できます
<!ELEMENT hr(employee*)>
- 最大で1つの従業員の子ノードがhrノードの下に表示されます
<!ELEMENT hr(employee?)>
4. XMLで<!DOCTYPE>タグを使用して、DTDファイルを参照します
書き方:
<!DOCTYPE 根节点 SYSTEM "dtd文件路径">
例:
<!DOCTYPE hr SYSTEM "hr.dtd">
最後のデモ
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hr SYSTEM "hr.dtd">
<hr>
<employee no="3309">
<name>kola</name>
<age>13</age>
<salary>2333</salary>
<department>
<dname>it</dname>
<address>xx大厦</address>
</department>
</employee>
<employee no="3319">
<name>lily</name>
<age>13</age>
<salary>3211</salary>
<department>
<dname>it</dname>
<address>xx大厦</address>
</department>
</employee>
</hr>
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT hr (employee+)>
<!ELEMENT employee (name,age,salary,department)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT salary (#PCDATA)>
<!ELEMENT department (dname,address)>
<!ELEMENT dname (#PCDATA)>
<!ELEMENT address (#PCDATA)>
<!ATTLIST employee no "CDATA" "">
親タグで子タグの数を指定する場合、親タグとそれに続く括弧の間に「スペース」が必要であることに注意してください。
//属性を定義するときの制約形式
<!ATTLISTノード名属性名CDATA ""> //デフォルト値は引用符で囲まれています
3、スキーマの制約
- XMLスキーマはDTDよりも複雑で、より多くの機能を提供します。
- XMLスキーマは、データ型、形式の制限、データ範囲などの機能を提供します。
- XMLスキーマはW3C標準です。
より複雑なので、コードに移動してコメントを読んでください〜
<?xml version="1.0" encoding="UTF-8"?>
<!--<!DOCTYPE hr SYSTEM "hr.dtd">-->
<!--告诉xml文档约束使用的是schema-->
<hr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="hr.xsd">
<employee no="3309">
<name>kola</name>
<age>13</age>
<salary>2333</salary>
<department>
<dname>it</dname>
<address>xx大厦</address>
</department>
</employee>
<employee no="3319">
<name>lily</name>
<age>13</age>
<salary>3211</salary>
<department>
<dname>it</dname>
<address>xx大厦</address>
</department>
</employee>
</hr>
<?xml version="1.0" encoding="utf-8" ?>
<!--定义schema:idea工具这句话要删掉,否则会报错-->
<!--<schema xmlns="http://www.w3.org/2001/XMLSchema">-->
<!--声明根节点-->
<schema>
<element name="hr">
<!--coplexType标签含义是复杂节点,包含子节点时必须使用这个标签-->
<complexType>
<!--sequence表示序列,含义是子节点必须按照前后顺序书写-->
<sequence>
<!--约束子节点最多最少出现的次数-->
<element name="employee" minOccurs="1" maxOccurs="999">
<complexType>
<sequence>
<element name="name" type="string"></element>
<element name="age">
<!--限制年龄-->
<simpleType>
<restriction base="integer">
<maxExclusive value="60"></maxExclusive>
<minExclusive value="18"></minExclusive>
</restriction>
</simpleType>
</element>
<element name="salary" type="integer"></element>
<element name="department">
<complexType>
<sequence>
<element name="dname" type="string"></element>
<element name="address" type="string"></element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</sequence>
<!--属性设置:定义use表示属性在任何节点必须存在-->
<attribute name="no" type="string" use="required"></attribute>
</complexType>
</element>
</schema>