目次
生长汗青
XML和HTML对照之可扩大
XML和HTML对照之语法细节
XML考证之DTD
XML语法构造
XML定名空间
DOM4J读写配置文件
关于SLT
XML考证之DTD
如前面教程中所说的那样,XML的最大作用在于存储、传输以及交流数据。在这时期XML的准确性至关重要,为了保证XML的准确性人们采取了响应的步伐。
XML的准确性分为两方面:一方面是XML的语法,一方面是XML的内容。人们把具有准确语法的 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) '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) 的内容,更多相关内容请关注ki4网(www.ki4.cn)!