目次
生长汗青
XML和HTML对比之可扩大
XML和HTML对比之语法细节
XML考证之DTD
XML称号空间
XML语法结构
XML考证之Schema
DOM4J读写配置文件
关于SLT
XML考证之Schema
就像前面的文章所说的,经由历程DTD我们能够很轻易的推断要考证的XML是不是相符我们所定义的范例(元素之间的关联,属性的取值是不是准确)然则假如要考证元素的内容DTD就无计可施了,因而人们研讨了新的考证要领——Schema。
除了上面的上风以外Schema相关于DTD而言更令人兴奋的是其自身就是一个优越情势的XML文档,如许一来编写Schema就非常轻易了。相关于自身有一套自力的语法的DTD而言,无论是编写照样保护起来都是非常难题的。
一个Schema文件就是一个XML文件所以所编写一个XML对应的Schema的历程就是对比着XML写XML,如许的话编写Schema是非常轻易的。下面演示怎样对比XML编写其对应的Schema
原XML文件(test2.xml)
<?xml version="1.0"encoding="ISO-8859-1"?> <shiporder orderid="889923" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="shiporder.xsd"> <orderperson>George Bush</orderperson> <shipto> <name>John Adams</name> <address>Oxford Street</address> <city>London</city> <country>UK</country> </shipto> <item> <title>Empire Burlesque</title> <note>Special Edition</note> <quantity>1</quantity> <price>10.90</price> </item> <item> <title>Hide your heart</title> <quantity>1</quantity> <price>9.90</price> </item> </shiporder>
关于上面的这个XML下面我们最先建立一个Schema。顺从的准绳就是本来的XML怎样写那末其对应的Schema就怎样形貌,就像你在和一个人面临面的形貌一样。
Schema代码以下(shiporder.xsd)
<?xml version="1.0"encoding="ISO-8859-1" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="shiporder"> <xs:complexType> <xs:sequence> <xs:element name="orderperson"type="xs:string"/> <xs:element name="shipto"> <xs:complexType> <xs:sequence> <xs:elementname="name" type="xs:string"/> <xs:elementname="address" type="xs:string"/> <xs:elementname="city" type="xs:string"/> <xs:elementname="country" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="item"maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:elementname="title" type="xs:string"/> <xs:elementname="note" type="xs:string" minOccurs="0"/> <xs:elementname="quantity" type="xs:positiveInteger"/> <xs:element name="price"type="xs:decimal"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name="orderid"type="xs:string" use="required"/> </xs:complexType> </xs:element> </xs:schema>
代码剖析:
第一行是一切XML的声明无需赘述。
第二行为此XML(Schema自身就是一个XML)定义了一个定名空间。
从第四行最先才是对原XML的一些请求:
起首定义了根元素为shiporder(行4),其次由于shiporder元素有一个属性,个中包括其他的元素所以其为复合范例(行5)。然后经由历程sequence元素根据递次围困其子元素(行10---行15),形貌元素的称号以及元素的范例(行11----行14),假如须要形貌元素的限定前提(行22)。形貌根元素的属性,由因而必选属性所以挑选required关键字,须要注重的是这个属性必需放在末了(行29)
经由历程Schema考证XML的代码和前面文章中的DTD考证迥然不同,代码以下:
package ValidateXml; import java.io.File; import java.io.IOException; import javax.xml.XMLConstants; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; import org.xml.sax.ErrorHandler; import org.xml.sax.SAXException; importcom.sun.org.apache.xml.internal.utils.DefaultErrorHandler; public class XmlValidator { private String xsdFilePath; public XmlValidator(String xsdFilePath) { this.xsdFilePath =xsdFilePath; } public String validata(String xmlFilePath,ErrorHandler errorHandler) { String msg = null; SchemaFactoryfactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); try { Schema schema = factory.newSchema(new File(xsdFilePath)); Validator validator = schema.newValidator(); validator.setErrorHandler(errorHandler); validator.validate(new StreamSource(new File(xmlFilePath))); } catch (SAXExceptione) { msg = e.getMessage(); e.printStackTrace(); } catch (IOExceptione) { msg = e.getMessage(); e.printStackTrace(); } return msg; } public static void main(String[] args) { String xmlFilePath ="d://test2.xml"; String xsdFilePath ="d://shiporder.xsd"; XmlValidator my =new XmlValidator(xsdFilePath); String msg =my.validata(xmlFilePath, new DefaultErrorHandler()); System.out.println(msg == null); } }
假如原XML文件相符Schema文件中的形貌则返回true;不然抛出非常举行形貌那里不相符,而且返回false。(详细的操纵可在现实工程中自行定制,这里只是举行简朴的形貌)
以上就是XML简明教程(7) 的内容,更多相关内容请关注ki4网(www.ki4.cn)!