ホームページ  >  記事  >  バックエンド開発  >  XML の簡潔なチュートリアル (4)

XML の簡潔なチュートリアル (4)

黄舟
黄舟オリジナル
2017-02-18 15:30:101569ブラウズ

目次


開発履歴

XMLと拡張可能なHTMLの比較

XMLと構文詳細のHTML比較

XML 検証 DTD

XML

前のチュートリアルで述べたように、XML の最大の役割はデータを保存、送信、交換することです。この期間中、XML の正確性は非常に重要であり、XML の正確性を保証するために対応する措置が講じられました。

XML の正しさは 2 つの側面に分けられます。1 つは XML の構文、もう 1 つは XML の内容です。正しい構文を持つ XML を「整形式」XML と呼びます。整形式の XML ドキュメントの場合、ドキュメントの形式が XML 仕様に準拠していることを確認するだけです。文法的な誤りはありませんが、要素間の関係や属性の値が正しいかどうかはわかりません。整形式のドキュメントの場合、自社開発システムの設定ファイルやデータの保存と送信など、限られた用途でのみ使用される場合には、十分に対応できる可能性があります。ただし、他のユーザーに理解してもらったり、システムで XML ドキュメントを使用したり、データ交換を実行したりする場合は、XML が「合法」であることを確認する必要があります。このように、XML 検証メカニズムを提供する必要があるのは、自分が作成した XML 文書と他の人が作成した XML 文書の構造が同じであること、要素間の関係が正しいことを保証することです。属性の値が要件を満たしていること。

このメカニズムは、XML 標準で提供されており、前述した DTD (Document Type Definition) です。つまり、DTD を通じて、自分の XML が「正当な」XML であるかどうかを検証できます。

XML ドキュメント内で DTD を直接定義することも、URI を通じて外部 DTD ファイルを導入することもできます。内部 DTD は便利ですが、文書自体が長いため送信の負担が大きくなります。また、複数の XML 文書で DTD を共有したい場合は、それぞれの文書に DTD を追加する必要があり、非常に面倒です。したがって、推奨されるアプローチは、別のファイルで DTD を定義し、XML ドキュメントの URI を介して外部 DTD ファイルを参照することです。

以下は、DTD ファイルを使用して XML ファイルの正当性を検証する方法を示しています


test.xml ファイル コード

<?xml version="1.0" encoding="gb2312" standalone="no"?>
<!DOCTYPE student SYSTEM "test.dtd">
<!--这是XML文档-->
<student>
	<name>张三</name>
	<age>24</age>
</student>



代码解析:在第二行中将外部的DTD文档引入,用于判断XML是否合法。其中用的路径为相对路径,网上很多XML中引入的DTD是一个URI,无论是相对还是绝对的路径,总之只要XML能找到其对应的DTD就是可行的。

test.dtd文件代码

<!ELEMENT student (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ATTLIST student sex (man | woman) &#39;man&#39;>



代码解析:第一行至第三行定义了XML文件中的元素,以及元素之间的关系。在第四行定义了student属性中对sex的限制内容,其默认为man而且只能选取两个值man或者woman。

下面开始验证XML的合法性:



package ValidateXml;

import java.io.FileNotFoundException;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class ValidateXMLDTD {
    
    public static void main(String[] args) {
//       test1XML();
       test2XML();
    }
    
    public static void test1XML() {
        try {
        	InputSource ips=new InputSource();
        	ips.setSystemId("d:\\test.xml");
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            dbf.setValidating(true);
            DocumentBuilder db = dbf.newDocumentBuilder();
            db.parse(ips);
        System.out.println("xml 正确!");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public static void test2XML() {
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            dbf.setValidating(true);
            DocumentBuilder db = dbf.newDocumentBuilder();
            db.parse(new java.io.FileInputStream("d:\\test.xml"));
        System.out.println("xml 正确!");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}



代码解析:上面的代码验证XML是否为合法,需要注意的是不要直接将XML读入到输入流中,那样的话会找不到相对路径下的DTD,调用test2XML会报错如下,如果调用test1XML则会正确验证XML。

直接用输入流读入的话XML寻找相对路径会在eclipse的环境下进行寻找DTD,如果用setSystemId进行设置的话会根据XML自己存在的目录中寻找DTD(参看具体解释),很显然后一种方式才是我们想要的。

通过DTD我们可以很容易的判断要验证的XML是否符合我们所定义的规范(元素之间的关系,属性的取值是否正确)但是如果要验证元素的内容DTD就无能为力了,于是人们研究了新的验证方法——Schema。就像人们远行一样,当对时间要求不苛刻的时候,火车便宜而且安全;当对时间有严格要求的时候,飞机也是不错的选择。根据实际需要改进技术,根据实际需要选择技术。量体裁衣,明智之举。

 以上就是XML简明教程(4) 的内容,更多相关内容请关注PHP中文网(www.php.cn)!


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。