通过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 ...
随机推荐
- HDU 2567 寻梦(字符串,插入)
#include<iostream> #include<stdio.h> #include<string.h> #include<cmath> usin ...
- Codeforces #449 Div2 D
#449 Div2 D 题意 交互式类题目. 起始有 n 张纸,会给出 m 次数字 p (\(1 \leq p \leq c\)),每次可选择一张纸,并在纸上写上这个数字,如果纸上已经存在数字,会覆盖 ...
- HDUOJ题目HTML的爬取
HDUOJ题目HTML的爬取 封装好的exe/app的GitHub地址:https://github.com/Rhythmicc/HDUHTML 按照系统选择即可. 其实没什么难度,先爬下来一个题目的 ...
- [BZOJ 1801] Chess
Link: BZOJ 1801 传送门 Solution: 一眼看过去又像是状压$dp$的经典模型…… 但此题$n,m\le 100$ ,直接跑状压只有50分 此时要发现这道题的特点:每行/列不能放置 ...
- [Contest20180122]超级绵羊异或
题意:求$a\ xor\left(a+b\right)xor\cdots xor\left(a+b\left(n-1\right)\right)$ 对每一位求答案,第$k$的答案是$\sum\limi ...
- 【左偏树】HDU1512-Monkey King
[题目大意] 在一个森林里住着N(N<=10000)只猴子.在一开始,他们是互不认识的.但是随着时间的推移,猴子们少不了争斗,但那只会发生在互不认识(认识具有传递性)的两只猴子之间.争斗时,两只 ...
- Java如何实现系统监控、系统信息收集(转
Java如何实现系统监控.系统信息收集.sigar开源API的学习 系统监控(1) Jar资源下载:http://download.csdn.net/detail/yixiaoping/4903853 ...
- Bootstrap响应式布局
Bootstrap响应式布局可以使用栅格化系统,其实就是不同的列组合,配合起来便能组合出强大的功能,系统会自动分为最多12列,超出12列会作为一个整体另起一行,像制作表格table的合并列,功能跟co ...
- PostgreSQL on Linux 最佳部署手册
安装常用包 # yum -y install coreutils glib2 lrzsz mpstat dstat sysstat e4fsprogs xfsprogs ntp readline-de ...
- 14、高可用keepalived搭建及切换
keepalived主从切换试验: 1.先搭建192.168.1.20与192.168.1.21的主主架构 192.168.1.76为VIP 2.在2机都安装keepalived tar - ...