目次
開発履歴
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 であるかどうかを検証できます。
代码解析:在第二行中将外部的DTD文档引入,用于判断XML是否合法。其中用的路径为相对路径,网上很多XML中引入的DTD是一个URI,无论是相对还是绝对的路径,总之只要XML能找到其对应的DTD就是可行的。 test.dtd文件代码 代码解析:第一行至第三行定义了XML文件中的元素,以及元素之间的关系。在第四行定义了student属性中对sex的限制内容,其默认为man而且只能选取两个值man或者woman。 下面开始验证XML的合法性: 代码解析:上面的代码验证XML是否为合法,需要注意的是不要直接将XML读入到输入流中,那样的话会找不到相对路径下的DTD,调用test2XML会报错如下,如果调用test1XML则会正确验证XML。
直接用输入流读入的话XML寻找相对路径会在eclipse的环境下进行寻找DTD,如果用setSystemId进行设置的话会根据XML自己存在的目录中寻找DTD(参看具体解释),很显然后一种方式才是我们想要的。 通过DTD我们可以很容易的判断要验证的XML是否符合我们所定义的规范(元素之间的关系,属性的取值是否正确)但是如果要验证元素的内容DTD就无能为力了,于是人们研究了新的验证方法——Schema。就像人们远行一样,当对时间要求不苛刻的时候,火车便宜而且安全;当对时间有严格要求的时候,飞机也是不错的选择。根据实际需要改进技术,根据实际需要选择技术。量体裁衣,明智之举。 以上就是XML简明教程(4) 的内容,更多相关内容请关注PHP中文网(www.php.cn)!<?xml version="1.0" encoding="gb2312" standalone="no"?>
<!DOCTYPE student SYSTEM "test.dtd">
<!--这是XML文档-->
<student>
<name>张三</name>
<age>24</age>
</student>
<!ELEMENT student (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ATTLIST student sex (man | woman) 'man'>
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();
}
}
}