TestSchema.java
package xmlSchema; import org.xml.sax.helpers.DefaultHandler; import org.xml.sax.*; import java.io.*; import javax.xml.validation.*; import javax.xml.transform.stream.StreamSource; public class TestSchema { public static void main(String[] args) { File xsdfile = new File("orders.xsd"); File xmlfile = new File("orders.xml"); Handler errorHandler = null; try { SchemaFactory schemaFactory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); Schema schema = schemaFactory.newSchema(xsdfile); Validator validator = schema.newValidator(); errorHandler = new Handler(); validator.setErrorHandler(errorHandler); validator.validate(new StreamSource(xmlfile)); } catch(Exception e) { System.out.print(e); } if(errorHandler.errorMessage == null) System.out.println("xml文件:" + xmlfile.getName() + "符合模式"); else System.out.println("xml文件:" + xmlfile.getName() + "不符合模式"); } } class Handler extends DefaultHandler{ String errorMessage = null; public void error(SAXParseException e)throws SAXException{ errorMessage = e.getMessage(); int row = e.getLineNumber(); int columns = e.getColumnNumber(); System.out.println("一般错误" + errorMessage + "位置:" + row + "," + columns); } public void fatalError(SAXParseException e)throws SAXException{ errorMessage = e.getMessage(); int row = e.getLineNumber(); int columns = e.getColumnNumber(); System.out.println("致命错误" + errorMessage + "位置:" + row + "," + columns); } }
orders.xml
<?xml version="1.0" encoding="utf-8"?> <orders> <!-- 所有订单信息 --> <order> <!-- 订单,至少包含1个订单 --> <orderDate>2018-05-20</orderDate><!--orderDate为日期型 --> <shipTo country="CN"><!-- 配送信息,country属性必须出现 --> <name>张三峰</name> <!-- 收件人,长度小于50 --> <street>市中区滨河路778号5+3大酒店</street> <!-- 县/区及街道地址 --> <city>乐山市</city> <!-- 市/区,长度小于50 --> <state>四川省</state> <!-- 省/自治区/直辖市,长度小于50 --> <phone>13999999999</phone> <!-- 联系电话,要求必须是1开头,后面第2位数字3-9,再后面是9个数字 --> </shipTo> <items> <!-- 商品列表,item应至少出现1次 --> <item partNum="872-AA"> <!-- 商品编号属性,必须有 --> <productName>香辣鸡翅</productName><!-- 商品名称,长度小于50 --> <quantity>1</quantity> <!-- 购买数量,至少是1 --> <price>18.95</price> <!-- 单价为浮点数,大于0.0 --> <shipDate>2018-5-21</shipDate> <!-- 配送日期 --> </item> <item partNum="926-AA"> <productName>烧烤五花肉</productName> <quantity>20</quantity> <price>39.98</price> <shipDate>2018-5-20</shipDate> </item> </items> </order> </orders>
orders.xsd
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="orders"> <xsd:complexType> <xsd:sequence> <xsd:element ref="order"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="order"> <xsd:complexType> <xsd:sequence> <xsd:sequence> <xsd:element name="orderDate" type="xsd:date" /> <xsd:element ref="shipTo"/> <xsd:element ref="items"/> </xsd:sequence> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="shipTo"> <xsd:complexType> <xsd:sequence> <xsd:element ref="name"/> <xsd:element name="street"/> <xsd:element ref="city"/> <xsd:element ref="state"/> <xsd:element ref="phone"/> </xsd:sequence> <xsd:attribute name="country" type="xsd:string" use="required"/> </xsd:complexType> </xsd:element> <xsd:element name="name"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:maxLength value="50"></xsd:maxLength> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="city"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:maxLength value="50"></xsd:maxLength> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="state"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:maxLength value="50"></xsd:maxLength> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="phone"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:pattern value="1[3-9]{9}"/> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="items"> <xsd:complexType> <xsd:sequence> <xsd:element ref="item" minOccurs="1" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="item"> <xsd:complexType> <xsd:sequence> <xsd:element ref="productName"/> <xsd:element ref="quantity"/> <xsd:element ref="price"/> <xsd:element name="shipDate"/> </xsd:sequence> <xsd:attribute name="partNum" type="xsd:string" use="required"/> </xsd:complexType> </xsd:element> <xsd:element name="productName"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:maxLength value="50"></xsd:maxLength> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="quantity"> <xsd:simpleType> <xsd:restriction base="xsd:integer"> <xsd:minInclusive value="1"/> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="price"> <xsd:simpleType> <xsd:restriction base="xsd:float"> <xsd:minInclusive value="0.0"/> </xsd:restriction> </xsd:simpleType> </xsd:element> </xsd:schema>