목차
개발 내역
XML비교 HTML 확장 가능
XML 및 HTML 비교 구문 세부 정보
XML 유효성 검사 DTD
XML구문 구조
XML네임스페이스
DOM4J구성 파일 읽기 및 쓰기
SLT 정보
이전 튜토리얼에서 언급했듯이 XML의 가장 큰 역할은 데이터를 저장하고 전송하고 교환하는 것입니다. 이 기간 동안 XML의 정확성은 매우 중요했으며 XML의 정확성을 보장하기 위한 상응하는 조치가 취해졌습니다.
XML의 정확성은 두 가지 측면으로 나누어집니다. 하나는 XML의 구문이고 다른 하나는 XML의 내용입니다. 사람들은 올바른 구문을 가진 XML을 "잘 구성된" XML이라고 부릅니다. 잘 구성된 XML 문서의 경우 문서 형식이 XML 사양을 준수하는지 확인해야 합니다. 문법적 오류는 없지만 요소 간의 관계와 속성 값이 올바른지 알 수 없습니다. 잘 구성된 문서의 경우, 자체 개발한 시스템의 구성 파일이나 데이터의 저장 및 전송과 같은 제한된 용도로만 사용된다면 우리의 용도에 잘 부합할 수도 있습니다. 그러나 다른 사용자가 이해하도록 하거나 시스템이 XML 문서를 사용하거나 데이터 교환을 수행하도록 하려면 XML이 "합법적"인지 확인해야 합니다. 이런 방식으로 XML 검증 메커니즘을 제공하는 것이 필요합니다. 그 목적은 우리가 작성한 XML 문서와 다른 사람이 작성한 XML 문서의 구조가 동일하고 요소 간의 관계가 올바른지, 그리고 값이 맞는지 확인하는 것입니다. 의 속성이 요구사항을 준수합니다.
이 메커니즘은 앞서 언급한 DTD(Document Type Definition)인 XML 표준에서 제공되었습니다. 즉, 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) 'man'>
代码解析:第一行至第三行定义了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)!