DTDとXMLベースの代替:00 03JavaスキーマWeb開発

1スキーマはじめに

DTD構文:<ELEMENT要素名の制約!>

XMLスキーマ構文に沿って、XML構文とラインインチ

一つだけのDTD、XMLスキーマよりも多く存在することができます。複数のスキーマの名前空間は、(Javaパッケージ名と同様に)区別します。

唯一のPCDATAタイプですが、スキーマの内部に複数のデータ型をサポートすることができDTDは
| -年齢など、唯一の整数であることができ、直接整数型を定義することができ、スキーマ
ため、スキーマ構文を見つけるには、より厳しいです。

スキーマ構文が複雑で、スキーマは現在、2つの共存をDTD置き換えることはできません。

2つのスキーマの開発プロセス

スキーマファイル、サフィックス名を作成します.xsd
| -ルート<schema>
| -スキーマにおける要素内
| - (1)プロパティ:xmlns="http://www.w3.org/2001/XMLSchema"現在のファイルが制約ファイルのXMLであることを示し
| - :(2)のプロパティtargetNamespace="http://www.itcast.cn/20151111"ファイルのスキーマの制約を使用して、制約は、アドレスファイルを介して直接導入されます
| - (3)属性:elementFormDefault="qualified"
ステップ:
| - (1)はXMLで、何を定義するためにどのように多くの要素を参照してください<element>
| - (2)は、単純な要素と複雑な要素を見て。要素は複雑な、使用している場合<complexType>、及び<sequence>要素は、例えば、定義されます。

<complexType>
    <sequence>
        子元素
    <sequencs>
</complexType>

要素は、単純な、直接使用している場合は<element name="" type=""></element>フォーマット定義、属性名エレメント制約ファイル名を参照し、タイプは、データタイプを参照します。

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://www.example.org/person" 
xmlns:tns="http://www.example.org/person" 
elementFormDefault="qualified">
<element name="person">
    <complexType>
        <sequence>
            <element name="name" type="string"></element>
            <element name="age" type="int" />
        </sequence>
    </complexType>
</element>

</schema>

| - (3)ファイル内の制約ファイルの導入を制約する内部、xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"プロパティファイルを示しますが、ファイルに制約されるxmlns="http://www.itcast.cn/20151111"属性は、targetNamespace属性でバインドされた文書、XSIは:のschemaLocation =「http://www.itcast.cn/20151111プロパティは、位置制約ファイル(フォーマットを指す」person.xsdをtargetNamespace 空格 约束文件地址路径

<?xml version="1.0" encoding="UTF-8"?>
<person xmlns="http://www.example.org/person"
xmlns:per="http://www.w3.org/2001/XMLSchema-instance"
per:schemaLocation="http://www.example.org/person person.xsd"
>
    <name>lks</name>
    <age>23</age>
</person>

3つのスキーマ制約API見ます

(1) <sequence>出現順に要素を表す
(2) <all>要素は一度だけ表示されることを表し
(3) <choice>要素が発生する可能性が表す
(4)maxOccurs="unbounded":attribute要素を、要素が出現数を表し
(4) <any></any>任意の要素を表します

もしプロパティ制約することができる
内部複合要素に書き込まれた(1);
書かれた(2)</complex>の前に、
(3)構文:<attribute name="" type="" use=""></attribute>属性名、単により多くの制約プロパティ名、タイプ、プロパティタイプが、使用プロパティが必要が存在しなければならないを意味する(存在しなければならない意味するかどうかを指し)。

複雑なスキーマの制約
(1)複数のスキーマファイルの導入は、名前から個々のファイルを与えることができます。
(2)要素に冗長なスキーマファイルの制約の複数使用することができる别名:元素定義します。

4つのサックス解決プロセス

DOMとSAX:解析XMLには2つの手法をあります。

DOM技術的手順:
(1)分配XML階層ツリー構造のメモリ内によれば
、XMLタグ(2)、属性は、テキストオブジェクトが中に包装されています

サックスの方法:イベント駆動型、読みながら解像度。

java.xml.parsersパッケージ内のどの:
(1)public abstract class SAXParser extends Object:SAXParserFactory.newSAXParserから例えばCAN()メソッドの例。使用public void parse​(File f, DefaultHandler dh) throws SAXException, IOException方法は、第一パラメータは第2のパラメータは、イベントハンドラであり、XMLパスです。
(2) public abstract class SAXParserFactory extends Object例()newInsanceにより得られます。

サックス実装プロセス:

使用のJAXP 5サックス方法

サックスの方法は、追加および削除が唯一のクエリ操作のために行うことができます達成することはできません

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<person>
    <p1>
        <name>lks</name>
        <age>23</age>
    </p1>
    <p1>
        <name>hhy</name>
        <age>20</age>
    </p1>
</person>
public class JaxpTest {

	public static void main(String []args) throws Exception{
		SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
		SAXParser saxParser = saxParserFactory.newSAXParser();
		saxParser.parse("src/dtdlearn/mydtd00/person.xml", new MyDefaultHandler());
	}
}

文書全体をプリントアウト。
(1)パーサ機能の作成
(2)パーサを作成する
(3)解析法行う
(4)自体がクラスを作成し、その継承たDefaultHandler
書き換え型内部の三つの方法(5)

class MyDefaultHandler extends DefaultHandler{

	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		// TODO Auto-generated method stub
		System.out.print("<" + qName + ">");
	}

	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		// TODO Auto-generated method stub
		System.out.print("<\\" + qName + ">");
	}

	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		// TODO Auto-generated method stub
		System.out.print(new String(ch, start, length));
	}
	
}

すべてのname要素の値を取得します。
(1)偽へ=メンバー変数フラグを定義する
(2)がtrueに=、name要素場合、メソッド名要素かどうかをフラグ開始を決定する
(図3)は、コンテンツの真の、そしてもしそうであれば、プリントアウト文字()メソッドかどうかを決定するフラグです
( 4)名前の最後に実行、セットフラグが偽である場合

class MyDefaultHandler1 extends MyDefaultHandler{
	private boolean flag = false;

	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		// TODO Auto-generated method stub
		if( "name".equals(qName)) {
			flag = true;
		}
	}
	
	

	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		// TODO Auto-generated method stub
		if(flag== true) {
			super.characters(ch, start, length);
			System.out.println();
		}
	}



	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		// TODO Auto-generated method stub
		if( "name".equals(qName)) {
			flag = false;
		}
	}
} 

最初の名前と値の要素を取得します。
(1)メンバ変数を定義するには、IDX = 1
(2)は、メソッドの名前は、それがある場合、そうであれば、フラグ= trueにIDXが設定されているかを決定し続け、そして、であるかどうか開始を決定し
、決定フラグがtrue、そうであれば、印刷するかどうかである(3)コンテンツ
要素名の末尾を実行する(4)、フラグ= FALSE

class MyDefaultHandler2 extends MyDefaultHandler1{
	private int idx = 1;

	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		// TODO Auto-generated method stub
		super.startElement(uri, localName, qName, attributes);
	}

	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		// TODO Auto-generated method stub
		if( idx == 1) {
			super.characters(ch, start, length);
		}
	}

	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		// TODO Auto-generated method stub
		super.endElement(uri, localName, qName);
		if("name".equals(qName)) {
			idx++;
		}
	}
}
公開された77元の記事 ウォン称賛11 ビュー2634

おすすめ

転載: blog.csdn.net/weixin_43762330/article/details/104532645