XML-Schema验证

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>

猜你喜欢

转载自blog.csdn.net/gsj9086/article/details/80728315