通过xsd schema结构来验证xml是否合法
import sys
import StringIO
import lxml from lxml import etree
from StringIO import StringIO # Construct XML relevant to the XML schema we're validating against. By altering the string, adding/removing elements
# we can force different errors to occur when validating.
xml = StringIO('''
<CompanyDataRequest xmlns="http://xmlgw.companieshouse.gov.uk" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlgw.companieshouse.gov.uk http://xmlgw.companieshouse.gov.uk/v2-1/schema/CompanyData-v2-2.xsd">
<CompanyNumber>06937730</CompanyNumber>
<CompanyAuthenticationCode>123456</CompanyAuthenticationCode>
<MadeUpDate>2010-06-30x</MadeUpDate>
</CompanyDataRequest>
''') # Clear any previous errors
lxml.etree.clear_error_log() try:
# Get the XML schema to validate against
schema = lxml.etree.XMLSchema(file = 'http://xmlgw.companieshouse.gov.uk/v2-1/schema/CompanyData-v2-2.xsd')
# Parse string of XML
xml_doc = lxml.etree.parse(xml)
# Validate parsed XML against schema returning a readable message on failure
schema.assertValid(xml_doc)
# Validate parsed XML against schema returning boolean value indicating success/failure
print 'schema.validate() returns "%s".' % schema.validate(xml_doc) except lxml.etree.XMLSchemaParseError, xspe:
# Something wrong with the schema (getting from URL/parsing)
print "XMLSchemaParseError occurred!"
print xspe except lxml.etree.XMLSyntaxError, xse:
# XML not well formed
print "XMLSyntaxError occurred!"
print xse except lxml.etree.DocumentInvalid, di:
# XML failed to validate against schema
print "DocumentInvalid occurred!" error = schema.error_log.last_error
if error:
# All the error properties (from libxml2) describing what went wrong
print 'domain_name: ' + error.domain_name
print 'domain: ' + str(error.domain)
print 'filename: ' + error.filename # '<string>' cos var is a string of xml
print 'level: ' + str(error.level)
print 'level_name: ' + error.level_name # an integer
print 'line: ' + str(error.line) # a unicode string that identifies the line where the error occurred.
print 'message: ' + error.message # a unicode string that lists the message.
print 'type: ' + str(error.type) # an integer
print 'type_name: ' + error.type_name
封装类
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Eric.yue import os
import lxml.etree as ET
from StringIO import StringIO
import chardet class R3xmlCheck(object):
def __init__(self, element_xml):
self.elem_xml = element_xml def validate_xsd_xml(self, f_xml, elem_xsd):
try:
elem_xsd = elem_xsd.encode('utf-8')
xsd_doc = StringIO(elem_xsd)
xml_doc = StringIO(f_xml)
xmlschema_doc = ET.parse(xsd_doc)
xmlschema = ET.XMLSchema(xmlschema_doc)
xml = ET.parse(xml_doc)
xmlschema.assertValid(xml)
print 'schema.validate() returns "%s".' % xmlschema.validate(xml) except ET.XMLSchemaParseError, xspe:
# Something wrong with the schema (getting from URL/parsing)
print "XMLSchemaParseError occurred!"
print xspe except ET.XMLSyntaxError, xse:
# XML not well formed
print "XMLSyntaxError occurred!"
print xse except ET.DocumentInvalid, di:
# XML failed to validate against schema
print "DocumentInvalid occurred!" error = xmlschema.error_log.last_error
if error:
# All the error properties (from libxml2) describing what went wrong
print 'domain_name: ' + error.domain_name
print 'domain: ' + str(error.domain)
print 'filename: ' + error.filename # '<string>' cos var is a string of xml
print 'level: ' + str(error.level)
print 'level_name: ' + error.level_name # an integer
print 'line: ' + str(error.line) # a unicode string that identifies the line where the error occurred.
print 'message: ' + error.message # a unicode string that lists the message.
print 'type: ' + str(error.type) # an integer
print 'type_name: ' + error.type_name def run(self):
res = self.validate_xml(self.elem_xml)
if res["result"] is not True:
return res["info"] elem_xsd = self.get_xsd() with open(self.elem_xml) as f:
f_xml = f.read()
chardet_info = chardet.detect(f_xml)
if chardet_info['encoding'] == 'ascii':
f_xml = f_xml.encode('utf-8')
self.validate_xsd_xml(f_xml.strip(),elem_xsd) # matching schemaLocation url
def get_xsd(self):
with open("./xsd/multicacheschemas/MCCI_IN200100UV01.xsd") as f:
elem_xsd = f.read()
return elem_xsd def validate_xml(self, exml):
rinfo = {}
if os.path.exists(exml):
try:
ET.parse(exml)
rinfo['result'] = True
except Exception as err:
rinfo['result'] = False
rinfo['info'] = 'Parsing error info:{0}'.format(err)
return rinfo if __name__ == "__main__":
aa = R3xmlCheck("./xsd/aa.xml")
aa.run()
通过xsd schema结构来验证xml是否合法的更多相关文章
- XSD(XML Schema Definition)用法实例介绍以及C#使用xsd文件验证XML格式
XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD),作用是定义 XML 文档的合法构建模块,类似 DTD,但更加强大. 作用有: ①定义 ...
- 28.XSD(XML Schema Definition)用法实例介绍以及C#使用xsd文件验证XML格式
转自https://www.cnblogs.com/gdjlc/archive/2013/09/08/3308229.html XML Schema 语言也称作 XML Schema 定义(XML S ...
- 使用架构(XSD)验证XML文件
假使说XML是一个数据库,那么XSD就是这个数据库的结构.由此可见,XSD是如此重要,如果没有它,我们如何声明以及验证我们需要的XML数据文件的格式和合法性呢?那是不可能完成的任务,如果你将XML数据 ...
- Delphi 7验证XML合法性(利用DTD、XSD)
拥有正确语法的XML被称为“形式良好”的XML.通过DTD验证的XML是“合法”的XML.DTD(文档类型定义)的作用是定义XML 文档的合法构建模块.它使用一系列的合法元素来定义文档结构.XML S ...
- C# xsd 验证 XML数据有效性 问题
使用XSD进行批量数据导入时生成的XML数据有效性这样的功能已经不是第一次做了,之前做的时候都没有碰到什么问题,这些天在开发中遇到了一个很头痛的问题就是无论XSD文件规则怎么写,验证都是通过的. 下面 ...
- C# 利用Xsd验证xml
最近做项目时,用到了xml的序列化与反序列化, 发现最好用xsd来验证xml, 因为反序列化xml不校验xsd. 方法:xmlData变量为xml字符串 MemoryStream ms = new M ...
- C# 使用xsd文件验证XML 格式是否正确
C# 使用xsd文件验证XML 格式是否正确 核心示例代码: //创建xmlDocument XmlDocument doc = new XmlDocument(); //创建声明段 如<?xm ...
- Postman使用tv4进行JSON Schema结构验证和断言
JSON Scheme简介 对于JSON格式的请求数据或者响应数据,在不同的数据和场景下往往会有一部分动态的值及字段.此时我们可以使用JSON Scheme Validator(JSON结构验证)来验 ...
- XSD - <schema> 元素
<schema> 元素 <schema> 元素是每一个 XML Schema 的根元素: <?xml version="1.0"?> <x ...
随机推荐
- 非负整数可重集去重&排序+获得可重集的全排列的几种方法
非负整数可重集O(n)去重并排序 可重集是指元素可重复的集合,对于在一定区间内的正整数集,比如[1,n],我们可以在不不使用任何额外空间(包括不使用O(1)的空间)的情况下,用O(n)的时间复杂度完成 ...
- 线段树 (区间合并)【p2894】[USACO08FEB]酒店Hotel
Descripion 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 < ...
- POJ1330 Nearest Common Ancestors(最近公共祖先)(tarjin)
A - Nearest Common Ancestors Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%lld &am ...
- Linux命令之crontab
crontab [-u user] file crontab [-u user] [-l | -r | -e] [-i] [-s] crontab命令被用来提交和管理用户需要周期性执行的任务,与win ...
- 微软应用商店错误 0x00000194
也可以下载安装包手动更新尝试解决. ------------------------------------------------------------------- 今天OTA升级了1809,应 ...
- Xamarin XAML语言教程构建ControlTemplate控件模板 (二)
Xamarin XAML语言教程构建ControlTemplate控件模板 (二) (2)打开MainPage.xaml文件,编写代码,将构建的控件模板应用于ContentView中.代码如下: &l ...
- [CF911B]Two Cakes
题目大意: 有两种蛋糕,分别被切成了a块和b块,要把这些蛋糕分到n个盘子里. 要求每个盘子里只能有一种蛋糕,每一种蛋糕都被分.问最优情况下,盘子里至少能放几个蛋糕. 思路: 二分答案. 由于每个蛋糕都 ...
- a + b ——C语言初学者百题大战之四
#include <stdio.h> int main() { int a,b; scanf("%d %d",&a,&b); printf(" ...
- noip2017集训测试赛(三) Problem B: mex [补档]
Description 给你一个无限长的数组,初始的时候都为0,有3种操作: 操作1是把给定区间[l,r][l,r] 设为1, 操作2是把给定区间[l,r][l,r] 设为0, 操作3把给定区间[l, ...
- Scala零基础教学【1-20】
基于王家林老师的Spark教程——共计111讲的<Scala零基础教学> 计划在9月24日内完成(中秋节假期之内) 目前18号初步学习到25讲,平均每天大约完成15讲,望各位监督. 初步计 ...